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

前端 未结 7 776
-上瘾入骨i
-上瘾入骨i 2020-12-28 17:54

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\"

相关标签:
7条回答
  • 2020-12-28 18:38

    From php-Script you can use:

    $pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');
    
    0 讨论(0)
  • 2020-12-28 18:38

    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".

    0 讨论(0)
  • 2020-12-28 18:39

    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.

    0 讨论(0)
  • 2020-12-28 18:39

    In prestashop you can do it in this way $pdf->Output(_PS_ROOT_DIR_.'/modules/xxx/ticket.pdf', 'F');

    0 讨论(0)
  • 2020-12-28 18:49

    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);
        }
    
    0 讨论(0)
  • 2020-12-28 18:50

    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.

    0 讨论(0)
提交回复
热议问题