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! ;-)
Partager