2015-03-04 26 views
9

Sto utilizzando il modulo Tcpdf e PHP per creare fatture PDF in formato Dymanic da un sistema di ordinazione.fopen(); "Accesso al file host remoto non accettato" su un file locale?

Lo script deve quindi salvare la fattura in una cartella denominata "fatture". La cartella esiste e ci sono permessi completi per "tutti" (Windows).

Il codice che sto usando è questo:

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

Questo utilizza fopen per salvare il file.

Tuttavia l'errore che sto ottenendo è: Warning: fopen(): remote host file access not supported, file://invoices/Delivery Note.pdf

Si tratta di un file locale, non un unico telecomando.

ho tentato di aggiungere un/prefisso come questo:

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

ma poi ottengo questo errore invece: Warning: fopen(file:///invoices/Delivery Note.pdf): failed to open stream: No such file or directory

ho creato il file, e lasciato vuoto, ma lo stesso errore come sopra.

Qualcuno sa perché sto ricevendo questo errore?

risposta

15

da PHP-Script è possibile utilizzare:

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

questa è una risposta migliore rispetto a quella selezionata in quanto funzionerà ancora dopo l'aggiornamento di TCPDF. Grazie! – jrgd

+0

Mentre sono d'accordo che commentando il codice tcpdf_static.php è una cattiva idea, direi che specifica la posizione di uscita relativa alla DOCUMENT_ROOT è un'idea migliore che specificare la posizione di uscita relativo alla posizione dello script che è in esecuzione. Non c'è molto, anche se credo. – JamesG

-2

provare questo

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

ancora lo stesso errore: 'Attenzione: fopen (file: // E:/Siti Web/*******/www/fatture/Note.pdf consegna): non è riuscito ad aprire flusso: No such file or directory ' – user2924019

+0

echo $ _SERVER [ 'DOCUMENT_ROOT']. 'Note.pdf/fatture/consegna' poi ha colpito url stampato nella finestra Esplora risorse e verificare che si ottiene file o meno. –

+0

Il file non viene creato. Il percorso è corretto – user2924019

0

ho trovato il problema era che il percorso per fopen deve essere dalla radice del documento, e non dalla posizione script PHP.

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

Per esempio, se lo script PHP è all'interno della cartella "script", e si desidera creare il file PDF all'interno della cartella "fattura", lo script ha bisogno di avere "\ sceneggiatura \ fattura \ fattura. PDF".

8

Dopo l'aggiornamento a tcpdf 6.2.6 in vtiger 6.2 ho avuto lo stesso problema, inviando e-mail con pdf.

Così ho cambiato il file:

libraries/tcpdf/include/tcpdf_static.php 

ho commentato il codice a fopenLocal() e ha cambiato la linea

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

vedi:

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

Dopo cambiando questo, ha funzionato.

+0

Questo ha funzionato per me - grazie mille! – Andrew

+0

Non è necessario commentare il codice in tcpdf_static.php perché fornire un nome file con un nome di percorso assoluto, che DOCUMENT_ROOT fornirà, è tutto ciò che è necessario. – JamesG

+0

Soluzione di lavoro! – mirushaki

3

simile a user1007017, ma solo commentare la linea come mostrato di seguito (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

Io suggerisco di usare i seguenti come ha anche suggerito Gerd ma assicuratevi di utilizzare un percorso assoluto:

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

Il percorso deve essere un percorso assoluto & non un percorso relativo. Questo rapporto PHP bug spiega perché: 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.

si può quindi evitare di modificare il codice TCPDF e preoccuparsi di eventuali aggiornamenti che sostituiscono il codice modificato.

Problemi correlati