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 ответов:
После обновления до 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 computerfoo
).По этой и нескольким внутренним причинам файл:// wrapper ограничен абсолютными путями при явном вызове. для относительных путей либо используйте realpath () {как вы сделали в своем отчете}, либо опустите явное именование файловая оболочка.
После этого вы можете избежать изменения кода TCPDF и беспокоиться о любых обновлениях, заменяющих ваш измененный код.