IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Upload] Usurper la méthode is_uploaded_file


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [Upload] Usurper la méthode is_uploaded_file
    Bonjour à tous,

    Quelques indications avant de commencer:
    plateforme/OS: Linux
    serveur: Apache 1
    php: V4.3.x (ou >) | 5.2.x (ou >)
    register global off

    Voici sommairement le but de l'opération que je veux effectuer:
    -J'ai un formulaire avec plusieurs input-file.
    -Lorsque le formulaire est soumis tout les fichiers sont analysés pour vérifié si leur contenus est acceptable (vérification des extensions, des types-mime, de la taille etc...). Ceci est géré par une classe.
    -Une fois le travail effectué, il faut créer une archive zip de tous ces fichiers pour l'uploader sur le serveur.

    (A noter que je dois assurer la compatibilité avec PHP4 d'ou la création de certaine classes ci-dessous)

    Ou j'en suis:
    -Formulaire OK
    -Classe de vérification OK et Classe Upload OK
    -Classe création archive zip OK

    Le fonctionnement actuel:

    -Soumission formulaire OK
    -Check fichier OK
    -Création archive zip OK
    -Enregistrement zip sur le serveur NOK, mais tout les fichiers séparément OK

    Mon problème:
    -Ma classe d'Upload à plusieurs mode de fonctionnement: On peux lui dire d'uploader à partir d'un contexte $_FILES ou encore à partir d'un fichier déjà présent sur le serveur (en temporaire par exemple) + d'autres subtilités.
    -Je souhaiterais faire en sorte que mon fichier zip (qui est créé dynamiquement par code) soit uploader de la même façon que si ce zip avait été soumis par un http_files ($_FILES).
    =>
    Seulement, dans mes méthodes de vérification j'emploie la fonction is_uploaded_file pour vérifier que le fichier a bien été soumis par formulaire.
    Donc il m'envoie boulé, et me dit que le zip n'est pas valide pour être uploader: Logique.

    Ma solution:
    J'ai écrit une classe me permettant de simuler le fait qu'un fichier soit envoyer en http post files. Elle me de (Grossièrement):
    * Créer un fichier temporaire dans le dossier temp associé a php.
    * Créer les variables Global name, type, tmp_name, error et size dans la superglobal $_FILES (et accessoirement dans HTTP_POST_FILES, on sait jamais)
    * Créer les variables global associé au fichier dans la superglobal $GLOBALS
    * + check pour retourner les bons code d'erreur en fonction des variables d'environnement (max_upload_file etc..)

    (Je vais appeler "zip fake" le zip qui est soumis en se faisant croire qu'il a été envoyer par un form en http)
    Le test:
    Le fichier temp est donc bien créer au bon endroit, et si j'utilise ma classe Upload pour l'uploader à partir de celui-ci, cela fonctionne.
    MAIS, si je soumet mon "zip fake" à ma classe la méthode is_uploaded_file me renvoie false ce qui signifie que pour elle le fichier, qui est pourtant dans le bon dossier temporaire et donc la construction est fidèle à un $_FILES classique, n'est pas un fichier d'upload source correct.

    Bon on va dire que php fait bien son boulot, mais cela ne fait pas mes affaires !

    Ma question:

    Quel est le processus de vérification de is_uploaded_file? (Comment fonctionne cette méthode)
    (y'a surement un truc qui me manque et qui fait qu'il ne voient pas mon fichier comme étant soumis par http [meta caché? ])
    J'ai regardé les sources php (standard/basic_functions.c), mais cela ne m'a pas avancer pour autant car j'ai pas tout compris (Zend).

    Si votre lanterne pouvait m'éclairer cela serait d'un grand secours; car même si je peux uploader le fichier d'un façon différente j'aime pas bloquer sur un truc que je ne comprend pas! ;-)

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Personnellement au lieu d'essayer de feinter la fonction, j'ajouterais juste un contournement dans ma classe pour ne pas verifier is_uploaded_file() quand je le souhaite.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse,

    Ouai, comme je l'ai écrit je peux déjà le faire si j'envoie directement le fichier temp et non pas le tableau $_FILES.
    Maintenant le truc c'est que j'aimerais bien comment le faire en passant par is_upload_file

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    Citation Envoyé par Donaldinou Voir le message
    Merci pour la réponse,

    Ouai, comme je l'ai écrit je peux déjà le faire si j'envoie directement le fichier temp et non pas le tableau $_FILES.
    Maintenant le truc c'est que j'aimerais bien comment le faire en passant par is_upload_file
    au moment où le fichier est uploadé, PHP garde en mémoire interne la liste des fichiers dans un endroits qui n'est pas modifiable donc on ne peux pas modifier le comportement de la fonction is_uploaded_file

    si tu utilises de la POO, tu peux mettre ce système en place avec une classe principale qui s'occupe des traitements que tu as déjà développez. et ensuite tu as des classes enfants qui vérifient le fichier suivant la méthode de chargement

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Coucou,

    au moment où le fichier est uploadé, PHP garde en mémoire interne la liste des fichiers dans un endroits qui n'est pas modifiable donc on ne peux pas modifier le comportement de la fonction is_uploaded_file
    OK, merci!
    Je ne veux pas changer le comportement de is_uploaded_file (Ça ne serait pas correct ). Maintenant, y a t-il moyen d'accéder à cet espace mémoire (adresses?) pour y ajouter des fichiers?

    si tu utilises de la POO, tu peux mettre ce système en place avec une classe principale qui s'occupe des traitements que tu as déjà développez. et ensuite tu as des classes enfants qui vérifient le fichier suivant la méthode de chargement
    Exactement c'est plus ou moins le cas. Il me restait juste a trouver comment "surcharger" la méthode is_uploaded_file, ou du moins trouver un paliatif pour pouvoir l'utiliser sans passer par un post d'un formulaire avec des input files. Mais après si ce n'est pas possible en php pur et dur et bien tant pis

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    je pensais à une classe abstraite comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    abstract class TraitementFichier
    {
        abstract protected function testerFichier();
        abstract protected function chargementFichier();
     
        public function lancerTraitement()
        {
            if (!$this->testerFichier()) {
                echo "\n";
                echo get_class($this) . " : erreur fichier incorrect\n";
                echo "\n";
                exit();
            }
     
            $this->chargementFichier();
     
            // suite du traitement
     
            echo $this->contenuFichier;
        }
     
        protected $contenuFichier;
    }
     
     
    class TraitementFichierUpload extends TraitementFichier
    {
        public function __construct()
        {
        }
     
        protected function testerFichier()
        {
            return isset($_FILES['fichier']['tmp_name']) && is_uploaded_file($_FILES['fichier']['tmp_name']);
        }
     
        protected function chargementFichier()
        {
            $this->contenuFichier = file_get_contents($_FILES['fichier']['tmp_name']);
        }
    }
     
    class TraitementFichierGenere extends TraitementFichier
    {
        public function __construct($contenuFichier)
        {
            $this->contenuFichierTemporaire = $contenuFichier;
        }
     
        protected function testerFichier()
        {
            return ($this->contenuFichierTemporaire != '');
        }
     
        protected function chargementFichier()
        {
            $this->contenuFichier = $this->contenuFichierTemporaire;
        }
     
        private $contenuFichierTemporaire;
    }
    si le fichier est généré ça s'appelle comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $traitementFichier = new TraitementFichierGenere('contenu fichier généré');
    $traitementFichier->lancerTraitement();
    et si le fichier est uploadé c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $traitementFichier = new TraitementFichierUpload();
    $traitementFichier->lancerTraitement();

Discussions similaires

  1. [Upload] Tests PHPUnit et is_uploaded_file()
    Par Grégory PLANCHAT dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2007, 23h48
  2. [Upload] PB avec is_uploaded_file
    Par QuenTinO dans le forum Langage
    Réponses: 4
    Dernier message: 16/10/2007, 11h41
  3. upload fichiers via la méthode POST
    Par shiin dans le forum Réseau
    Réponses: 3
    Dernier message: 20/02/2007, 10h54
  4. [Upload] problème avec is_uploaded_file
    Par loopsy dans le forum Langage
    Réponses: 4
    Dernier message: 31/01/2007, 18h57
  5. [Upload] Fonction is_uploaded_file + envois multiples
    Par dj-julio dans le forum Langage
    Réponses: 7
    Dernier message: 21/12/2005, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo