fopen()";不接受远程主机文件访问”;在本地文件上


fopen(); "Remote host file access not accepted" on a local file?

我正在使用Tcpdf模块和PHP从订购系统创建动态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

我创建了这个文件,并将其留空,但出现了与上面相同的错误。

有人知道我为什么会犯这个错误吗?

从php脚本可以使用:

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

在升级到vtiger 6.2中的tcpdf6.2.6后,我也遇到了同样的问题,用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,但只是注释如下所示的行(tcpdf6.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);
    }

我建议使用Gerd也建议的以下内容,但请确保使用绝对路径:

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

路径必须是绝对路径&而不是相对路径。此PHP错误报告解释了原因:https://bugs.php.net/bug.php?id=28820

文件不支持相对路径的原因://wrapper归结为如何处理UNC路径的折衷(更具体地说,如何将/模糊地解释为用于windows安装)。

例如:

file://foo/bar

可以被解释为当前工作目录的相对URI:foo/bar,也可以被解释成UNC:''foo''bar(在计算机foo上共享bar)。

由于这一点和一些内部原因,当显式调用时,file://wrapper被限制为绝对路径对于相对路径,请使用realpath(){就像您在报告中所做的那样},或者省略文件包装器的显式命名。

这样就可以避免修改TCPDF代码,也不用担心任何升级会取代修改后的代码。

我发现问题是fopen的路径必须来自文档根,而不是PHP脚本位置。

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

例如,如果PHP脚本在"script"文件夹中,并且您希望在"invoice"文件夹中创建pdf,则脚本需要具有"''script''invoice''invoix.pdf"。

在prestashop中,您可以通过这种方式实现$pdf->输出(_PS_ROOT_DIR_'.'/modules/xxx/cticket.pdf','F');

您可以使用此脚本

'$'df->输出(目录名(FILE,2)。'/发票/提货单.pdf’,'F');

尝试这个

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