Еореп (); «Удаленный доступ к файлу хоста не принят» в локальном файле?

Я использую модуль Tcpdf и PHP для создания dymanic PDF-счетов из системы заказов.

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

Код, который я использую, следующий:

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

Для сохранения файла используется fopen.

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

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

Я попытался добавить / prefix следующим образом:

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

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

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

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

Из php-Script вы можете использовать:

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

После перехода на 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); } 

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

аналогично 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); } 

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

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

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

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

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

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

Причина относительных путей не поддерживается в файле: // обертка сводится к компромиссу в том, как обрабатываются пути UNC (а точнее, как / нечетко интерпретируются как \ для установки Windows).

Например:

Файл: // Foo / бар

Может интерпретироваться как относительный URI: foo / bar из текущего рабочего каталога, или его можно интерпретировать как UNC: \ foo \ bar ( bar foo на компьютере foo ).

Для этого и нескольких внутренних причин файл: // оболочка ограничен абсолютными путями при явном вызове. Для относительных путей используйте realpath () {, как это было в вашем отчете}, или опустите явное обозначение обертки файла.

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

попробуй это

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