web-dev-qa-db-fra.com

fopen (); "Accès au fichier de l'hôte distant non accepté" sur un fichier local?

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?

13
user2924019

De php-script, vous pouvez utiliser:

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

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

7
user 1007017

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);
    }
3
Hilarius L. Doren

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 ordinateur foo).

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

0
mattferderer

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

0
user2924019