J'utilise le module Tcpdf et PHP pour créer des factures dymanic PDF à partir d'un système de commande.
Le script doit ensuite enregistrer la facture dans un dossier appelé "factures". Le dossier existe et il existe des autorisations complètes pour "tout le monde" (Windows).
Le code que j'utilise est le suivant:
$pdf->Output('invoices/Delivery Note.pdf', 'F');
Ceci utilise fopen pour enregistrer le fichier.
Cependant l'erreur que j'obtiens est: Warning: fopen(): remote Host file access not supported, file://invoices/Delivery Note.pdf
C'est un fichier local, pas un fichier distant.
J'ai essayé d'ajouter un/préfixe comme ceci:
$pdf->Output('/invoices/Delivery Note.pdf', 'F');
mais alors je reçois cette erreur à la place: Warning: fopen(file:///invoices/Delivery Note.pdf): failed to open stream: No such file or directory
J'ai créé le fichier et l'ai laissé vide, mais avec la même erreur que ci-dessus.
Est-ce que quelqu'un sait pourquoi je reçois cette erreur?
De php-script, vous pouvez utiliser:
$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');
Après la mise à niveau vers la version tcpdf 6.2.6 dans vtiger 6.2, le même problème se présentait lors de l'envoi d'un courrier électronique au format PDF.
J'ai donc changé le fichier:
libraries/tcpdf/include/tcpdf_static.php
J'ai commenté le code dans fopenLocal () et changé de ligne
fopen($_SERVER['DOCUMENT_ROOT'].$filename, $mode);
voir:
/**
* 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);
}
Après avoir changé cela, cela a fonctionné.
similaire à user1007017
, mais commentez la ligne comme indiqué ci-dessous (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);
}
Je suggère d'utiliser ce qui suit comme Gerd l'a également suggéré, mais assurez-vous d'utiliser un chemin absolu:
$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');
Le chemin doit être un chemin absolu et non un chemin relatif. Ce rapport de bogue PHP explique pourquoi: https://bugs.php.net/bug.php?id=28820
La raison pour laquelle les chemins relatifs ne sont pas pris en charge avec le wrapper file: // revient à compromettre la façon dont les chemins UNC sont traités (et plus précisément comment/sont interprétés de manière floue comme\pour des installations Windows).
Par exemple:
fichier: // foo/bar
Peut être interprété comme un URI relatif: foo/bar du répertoire de travail actuel, OR, il peut être interprété comme un UNC:\foo\bar (share
bar
sur ordinateurfoo
).Pour cette raison et quelques raisons internes, le wrapper file: // est limité aux chemins absolus lorsqu'il est appelé explicitement. Pour les chemins relatifs, utilisez realpath () {comme dans votre rapport} ou omettez le nommage explicite du wrapper de fichier.
Vous pouvez alors éviter de modifier le code TCPDF et vous inquiéter de toute mise à niveau remplaçant votre code modifié.
J'ai trouvé que le problème était que le chemin d'accès à fopen devait provenir de la racine du document et non de l'emplacement du script PHP.
C:\Website\www\script\invoice\invoice.pdf
Par exemple, si le script PHP se trouve dans le dossier "script" et que vous souhaitez créer le fichier PDF dans le dossier "facture", le script doit comporter "\ script\invoice\invoice.pdf".