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