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

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

script должен затем сохранить счет-фактуру в папку под названием "счета-фактуры". Папка существует, и есть полные разрешения для "всех" (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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 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);
    }

Ответ 4

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

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

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

Ответ 5

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

$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).

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

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

Ответ 6

В prestashop вы можете сделать это следующим образом $pdf-> Вывод (_PS_ROOT_DIR _. '/Modules/xxx/ticket.pdf', 'F');

Ответ 7

попробуйте это

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