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


Я использую модуль 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

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

Я попытался добавить префикс / вот так:

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

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

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

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

6 10

6 ответов:

Из php-скрипта можно использовать:

$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

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

Например:

Файл:/ / foo / bar

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

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

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

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

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