Reload page comprenant un champ input type=file

Eléphanteau du PHP | 30 Messages

21 août 2007, 12:44

Bonjour,
j'ai déjà utilisé des champs input type=file et j'ai pu remarquer qu'il fallait impérativement les valider dès leur alimentation pour ne pas en perdre le contenu (principe du chargement temporaire sur le serveur).

Pourtant j'aimerais savoir s'il est possible de préserver le contenu du champ lors d'un reload de la page (c'est un form à champs "variables" et donc nécessite le rafraichissement). 8-)

Je me suis basé sur :
- le nom du fichier : $_FILES['fichier']['name'];
- la taille du fichier : $_FILES['fichier']['size'];
- l'adresse où elle est temporairement chargée sur le serveur en attendant un traitement éventuel : $_FILES['fichier']['tmp_name'];
...pour écrire :

Code : Tout sélectionner

if ($image) { $depot_image = $_FILES['image']['name'] ; $loca_image = $_FILES['image']['tmp_name'] ; echo "<INPUT TYPE='text' NAME='image' MAXLENGTH=80 SIZE=60 VALUE='".$depot_image."'><BR>Lieu de récup : ".$loca_image ; } else { // Récup' image sur son disque dur ==> hosting par FTP automatique... echo "<INPUT TYPE='file' SIZE=60 NAME='image' />" ; }
...sachant qu'après j'ai utilisé (une fois de plus) l'excellent tuto d'upload de fichier. :wink:

L'embêtant c'est que je ne récupère ni le nom ni l'adresse de cette image... :oops:

L'idée est bien sûr que le visiteur ne valide sa page que lorsque son form sera bien finalisé (page reloadée x fois au fur et à mesure de son alimentation), mais puisse toujours visualiser la chaîne-txt de l'image qu'il a sélectionnée pour upload, telle qu'on la voit avec le bouton "Parcourir".
Et alors seulement, à la validation, opérer l'upload.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

21 août 2007, 12:55

Pourtant j'aimerais savoir s'il est possible de préserver le contenu du champ lors d'un reload de la page (c'est un form à champs "variables" et donc nécessite le rafraichissement).
Pas à ma connaissance.
En effet, le champ textuel contient le chemin côté client, et c'est impossible de le récupérer.

Si tu as besoin de recharger certaines données, regarde du côté des technos Ajax, qui te permettent de recharger uniquement une partie de la page via Javascript.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Invité
Invité n'ayant pas de compte PHPfrance

21 août 2007, 14:48

En effet, le champ textuel contient le chemin côté client, et c'est impossible de le récupérer.
Merci pour la confirmation. J'espérais qu'il y ait un truc... :cry:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 août 2007, 14:55

Par contre, ce que tu pourrais imaginer faire, c'est d'uploader le fichier dans un dossier temporaire dès qu'il est présent et, si tu as noté qu'il est déjà uploadé, tu ne lui propose pas forcément un input type file mais uniquement un champ "Modifier image uploadé"
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 30 Messages

27 août 2007, 19:16

Bon... j'ai continué à travailler sur l'appli, en dissociant toute la partie "input type=file" des autres champs (page différente).
Avantage : je suis certain que les champs image seront pris en compte à la validation.

eh bien... pas du tout ! :shock:

ex :
echo "Contenu de Main_Image : ".$main_image." ... et de la chaîne : ".$_FILES['main_image']['name']."<BR>"  ;
donne :
Contenu de Main_Image : /tmp/phpy0KcJ3 ... et de la chaîne :

Tous les composants de $_FILES['main_image'] sont systématiquement vides ! :cry:
(il y a bien un underscore à tous les endroits nécessaires ! :wink: )
Et pourtant j'ai déjà utilisé ce tuto, avec complète satisfaction et succès.
Cela viendrait-il des droits du serveur ? (pas des droits en 777, je m'en suis évidemment occupé)

Comme suit :
   $dest_dossier = 'public/pic_comite/';

   // vérifie l'existence du répertoire de destination 
   if (!is_dir($dest_dossier)) { 
     echo "Répertoire destination incorrect !" ; 
     die();  
   }
   else {
     echo "C'est bon pour le Répertoire de destination !" ; 
   }

   // vérifie que répertoire de destination a des droits en écriture 
   if (!is_writeable($dest_dossier)) { 
     echo "Il faut spécifier des droits en écriture pour le répertoire de destination !" ; 
     die();       
   }
   else {
     echo "C'est bon pour les Droits du Répertoire de destination !" ; 
   }

        //  Le nom du fichier uploadé
        $file = $_FILES['main_image']['name'];

echo "File : ".$file." - Strlen() = ".strlen($main_image)."<BR>"  ;
Ca me rend :
C'est bon pour le Répertoire de destination !
C'est bon pour les Droits du Répertoire de destination !
File : - Strlen() = 14

Incompréhensible ! ça fait depuis Vendredi que je cherche là-dessus :evil: !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 août 2007, 23:20

Bizare...

ton input de type file est il bien placé à l'intérieur de ton formulaire ?
l'enctype spécifie-t-il bien le multipart ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 30 Messages

28 août 2007, 14:45

ton input de type file est il bien placé à l'intérieur de ton formulaire ?
Oui.
En cherchant la faille, j'ai même procédé à des tests genre lecture de la variable reçue avant l'ouverture de l'HTML, comme pour les variables de session.
Sans résultat.
l'enctype spécifie-t-il bien le multipart ?
Bonne idée bien entendu, mais... c'est correctement codé.

Merci pour les suggestions. :wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2007, 15:02

Ah bah on continue alors :)

Pas d'erreur dans l'upload ? $_FILES['main_image']['error']
le nom du champ est bien 'main_image' ?
t'as pas un autre champ avec le même nom qui écraserait la valeur ?
que contient $main_image (qu'à une taille de 14 que c'est plutôt bizare m'enfin bon) ?

euh... bah en fait montre donc le code du formulaire :)

montre nous également un print_r($_POST) et print_r($_FILES) lors de la récupération des données du formulaire... on va bien voir ce qu'il envoi et ce qu'il récupère et où disparait ce satané fichier :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 30 Messages

28 août 2007, 15:20

euh... bah en fait montre donc le code du formulaire :)

montre nous également un print_r($_POST) et print_r($_FILES)
C'est bien le bon nom de champ (voir ci-dessous), il a d'ailleurs été changé au cas où...
Quant au print_r($_FILES), il ne retourne rien !
le strlen qui retourne 14, c'est le résultat de /tmp/phpy0KcJ3 (par exemple)

Extraits du Form :
         echo "<FORM method=POST action='page_add_chk.php' name='finalisation_frm' enctype='multipart/form-data'>"  ;
      echo "<INPUT TYPE='hidden' NAME='responsable' VALUE=".$depositaire.">"  ;
      echo "<INPUT TYPE='hidden' NAME='gofurther' />"  ;             //  initialisation flag de retour sur la page généale de conception
      echo "<INPUT TYPE='hidden' NAME='delevent' />"  ;              //  initialisation flag de l'Event cliqué (suppression)
[...]
      echo "<TR><TD><H2>Image d'en-tête ou Logo</TD><TD></TD><TD COLSPAN=2>"  ;
      //  valable pour l'image du Plan d'accès ou les illustrations des Events
      echo "<INPUT TYPE='hidden' NAME='maxsize' value='512000' />"  ;
      //  Récup' image sur son disque dur ==> hosting par FTP automatique... donc PAS de RELOAD !
      echo "<INPUT TYPE='file' SIZE=60 NAME='main_image' />"  ;
      echo "</TD></TR>"  ;
      echo "<TR><TD><H2>Plan d'accès</TD><TD></TD><TD COLSPAN=2>"  ;
      //  Attention ! ne marche qu'au moment de la Validation... (pas de reload de page possible !)
      echo "<INPUT TYPE='file' SIZE=60 NAME='plan' />"  ;
      echo "</TD></TR>"  ;
[...]
      echo "<TR><TD COLSPAN=2></TD><TD ALIGN=CENTER VALIGN=BOTTOM><A HREF='javascript:document.nocontrib_frm.submit()' onMouseOver='mover(3,5)' onMouseOut='mout(3,5)'>"  ;
      echo "<IMG SRC='pic/bouton/del0.gif' WIDTH=16 HEIGHT=16 BORDER=0 NAME='etq3' ALIGN=ABSMIDDLE ALT='TOUT Annuler !'><BR><IMG SRC='pic/void.gif' WIDTH=2 HEIGHT=10 BORDER=0><BR>TOUT Annuler !</A></TD>"  ;
      echo "<TD ALIGN=CENTER VALIGN=BOTTOM><A HREF='javascript:document.finalisation_frm.submit()' onMouseOver='mover(2,3)' onMouseOut='mout(2,3)'>"  ;
      echo "<IMG SRC='pic/bouton/ice_ok0.gif' WIDTH=120 HEIGHT=32 BORDER=0 NAME='etq2' ALIGN=ABSMIDDLE ALT='Valider votre conception de page'><BR>Valider</A></TD></TR>" ;
      echo "</FORM>"  ;
et sur la page de récup', donc "page_add_chk.php" :
<?php

echo "Contenu de Main_Image : ".$main_image." ... et de la chaîne : ".$_FILES['main_image']['name']."<BR>"  ;
$lower_fichier = strtolower($_FILES['main_image']['name']) ;
echo "Lower : ".$lower_fichier." - ".print_r($_FILES)."<BR>"  ;   //  Histoire de voir si la casse est concernée
$event = $depot_event[1]  ;
echo "Event gardé : [".$event."] - son Responsable = ".$_POST['responsable']."<BR>"  ;  //  Marche parfaitement, on reçoit bien le contenu du Form (même variabilisé)

   //  Longueur minima de la chaine de $sonpic = 8 : c:/a.gif (ex.)
   $dest_fichier = ''  ;        //   assure le champ image_pc à blanc s'il n'y a pas d'illustration attachée
   if (strlen($main_image) > 8)  {    //  Autorisation d'enregistrement d'une image d'en-tête
     if(!empty($_FILES['main_image']))  {            // c'est CE test qui ne MARCHE PAS
        unset($erreurphoto);
        $extensions_ok = array('gif', 'jpg', 'jpeg');
        $taille_max = 512000;
        $dest_dossier = 'public/pic_comite/';
etc... + suite adaptée du tuto.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 août 2007, 15:00

Chuis un peu à cours d'idée.... ta version de php est elle bien supérieure ou égale à 4.1.0 ?

Si ce n'est pas le cas, il te faut utiliser utiliser $HTTP_POST_FILES au lieu de $_FILES ... après ça, j'avoue ne pas trop savoir ce qui peut bloquer l'upload...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

29 août 2007, 16:01

Chuis un peu à cours d'idée.... ta version de php est elle bien supérieure ou égale à 4.1.0 ?

Si ce n'est pas le cas, il te faut utiliser utiliser $HTTP_POST_FILES au lieu de $_FILES ...
Voila le result de mon phpinfo() à ce sujet : PHP/4.0.6 :idea:
je viens donc d'implémenter $HTTP_POST_FILES et... ça marche ! :lol:

Quel soulagement ! :D

Nul doute que l'hébergeur chez qui j'avais utilisé ce tuto d'upload n'avait pas la même version de Php !

Un gros-gros merci pour la soluce.