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

匿名 (未验证) 提交于 2019-12-03 02:06:01

问题:

I am using the Tcpdf module and PHP to create dymanic PDF invoices from an ordering system.

The script should then save the invoice into a folder called "invoices". The folder exists, and there are full permissions for "everyone" (Windows).

The code I am using is this:

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

This uses fopen to save the file.

However the error I am getting is: Warning: fopen(): remote host file access not supported, file://invoices/Delivery Note.pdf

This is a local file, not a remote one.

I attempted adding a / prefix like this:

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

but then I get this error instead: Warning: fopen(file:///invoices/Delivery Note.pdf): failed to open stream: No such file or directory

I created the file, and left it empty, but the same error as above.

Does anyone know why I am getting this error?

回答1:

From php-Script you can use:

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


回答2:

After upgrading to the tcpdf 6.2.6 in vtiger 6.2 I've had the same problem, sending e-mail with pdf.

So I have changed the file:

 libraries/tcpdf/include/tcpdf_static.php 

I have commented the code in fopenLocal() and changed the line

 fopen($_SERVER['DOCUMENT_ROOT'].$filename, $mode); 

see:

  /**          * 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);         } 

After changing this, it worked.



回答3:

similar to user1007017, but just comment the line like shown below (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:

I found the issue was that the path for fopen has to be from the document root, and not from the PHP script location.

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

For example if the PHP script is inside the "script" folder, and you want to create the pdf inside the "invoice" folder, the script needs to have "\script\invoice\invoice.pdf".



回答5:

I suggest using the following as Gerd has also suggested but make sure you use an absolute path:

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

The path must be an absolute path & not a relative path. This PHP bug report explains why: https://bugs.php.net/bug.php?id=28820

The reason relative paths are not supported with the file:// wrapper comes down to a compromise in how UNC paths are dealt with (and more specifically how / are fuzzily interpreted as \ for windows installations).

For Example:

file://foo/bar

Could be interpreted as a relative URI: foo/bar from the current working directory, OR it could be interpreted as a UNC: \foo\bar (share bar on computer foo).

For this and a few internal reasons the file:// wrapper is limited to absolute paths when called explicitly. For relative paths either use realpath() {as you did in your report}, or omit the explicit naming of the file wrapper.

You can then avoid modifying the TCPDF code and worrying about any upgrades replacing your modified code.



回答6:

try this

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!