2015-03-04 1 views
9

Я использую модуль Tcpdf и PHP для создания dymanic PDF-счетов из системы заказов.fopen(); «Удаленный доступ к файлу хоста не принят» в локальном файле?

Затем сценарий должен сохранить счет-фактуру в папку под названием «счета-фактуры». Папка существует, и для «всех» (Windows) есть полные разрешения.

код, я использую это:

$pdf->Output('invoices/Delivery Note.pdf', 'F'); 

Это использует FOPEN для сохранения файла.

Однако ошибка я получаю: Warning: fopen(): remote host file access not supported, file://invoices/Delivery Note.pdf

Это локальный файл, а не удаленный один.

Я попытался добавить/приставку, как это:

$pdf->Output('/invoices/Delivery Note.pdf', 'F'); 

, но затем я получаю эту ошибку вместо того, чтобы: Warning: fopen(file:///invoices/Delivery Note.pdf): failed to open stream: No such file or directory

Я создал файл, и оставил его пустым, но та же ошибка, как указано выше.

Кто-нибудь знает, почему я получаю эту ошибку?

ответ

15

От PHP-скрипт, который вы можете использовать:

$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F'); 
+0

Это лучший ответ, чем тот, который был выбран, поскольку он будет работать после обновления TCPDF. Благодаря! – jrgd

+0

Хотя я согласен с тем, что комментирование кода в tcpdf_static.php - плохая идея, я бы сказал, что определение местоположения вывода относительно DOCUMENT_ROOT - это лучшая идея, чем указание выходного местоположения относительно местоположения выполняемого скрипта. Не так много, хотя я думаю. – JamesG

-2

попробовать это

$pdf->Output($_SERVER['DOCUMENT_ROOT'].'/invoices/Delivery Note.pdf', 'F'); 
+1

Все те же ошибки: 'Предупреждение: fopen (файл: // E:/Веб-сайты/*******/www/invoices/Delivery Note.pdf): не удалось открыть поток: нет такого файла или каталога ' – user2924019

+0

echo $ _SERVER ['DOCUMENT_ROOT']. '/ Invoices/Delivery Note.pdf' затем нажимает напечатанный URL-адрес в вашем проводнике и проверяет, есть ли у вас файл или нет. –

+0

Файл не создается. Путь верен – user2924019

0

Я нашел проблему в том, что путь для FOPEN должен быть от корня документа, а не от места PHP скрипт.

C:\Website\www\script\invoice\invoice.pdf

Например, если PHP скрипт внутри папки «сценария», и вы хотите создать PDF-файл в папке «счета», скрипт должен иметь «\ скрипт \ накладная \ счет-фактура. PDF».

8

После обновления до tcpdf 6.2.6 в vtiger 6.2 У меня была такая же проблема, отправляя электронное письмо с помощью pdf.

Так что я изменил файл:

libraries/tcpdf/include/tcpdf_static.php 

Я комментировал код в fopenLocal() и изменил линию

fopen($_SERVER['DOCUMENT_ROOT'].$filename, $mode); 

см:

/** 
     * Wrapper to use fopen only with local files 
     * @param filename (string) Name of the file to open 
     * @param $mode (string) 
     * @return Returns a file pointer resource on success, or FALSE on error. 
     * @public static 
     */ 
     public static function fopenLocal($filename, $mode) { 
    //  if (strpos($filename, '://') === false) { 
    //   $filename = 'file://'.$filename; 
    //  } elseif (strpos($filename, 'file://') !== 0) { 
    //   return false; 
    //  } 
      return fopen($_SERVER['DOCUMENT_ROOT'].$filename, $mode); 
     } 

После изменив это, он сработал.

+0

Это сработало для меня - большое спасибо! – Andrew

+0

Вам не нужно закомментировать код в tcpdf_static.php, потому что предоставление имени файла с абсолютным именем пути, которое вам предоставит DOCUMENT_ROOT, - это все, что вам нужно. – JamesG

+0

Рабочее решение! – mirushaki

3

похож на user1007017, а просто закомментировать строку, как показано ниже (TCPDF 6.2.11)

public static function fopenLocal($filename, $mode) { 
     if (strpos($filename, '://') === false) { 
      //$filename = 'file://'.$filename; 
     } elseif (stream_is_local($filename) !== true) { 
      return false; 
     } 
     return fopen($filename, $mode); 
    } 
0

Я предлагаю использовать следующий как Герд также предложил, но убедитесь, что вы используете абсолютный путь:

$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');

путь должен быть абсолютный путь & не относительный путь. Этот отчет PHP ошибки объясняет, почему: https://bugs.php.net/bug.php?id=28820

The reason relative paths are not supported with the file:// wrapper comes down to a compromise in how UNC paths are dealt with (and more specifically how/are fuzzily interpreted as \ for windows installations).

For Example:

file://foo/bar

Could be interpreted as a relative URI: foo/bar from the current working directory, OR it could be interpreted as a UNC: \foo\bar (share bar on computer foo).

For this and a few internal reasons the file:// wrapper is limited to absolute paths when called explicitly. For relative paths either use realpath() {as you did in your report}, or omit the explicit naming of the file wrapper.

Вы можете избежать изменений коды TCPDF и беспокоиться о каких-либо обновлениях, заменяющих измененный код.