Script d'upload de fichier => Rien ne se passe

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Script d'upload de fichier => Rien ne se passe

par mfrancky » 06 avr. 2006, 10:55

Cette nuit j'y ai pensé et je me disais aussi qu'une seule instruction ne pouvait pas envoyer 2 fichiers, comment pouvait t'il s'y reperer donc j'avais ans l'idée de faire ceci ce matin.

Merci Ryle.

Je crois que mon sujet est complet et résolu.

Re: Un éclair de génie

par Ryle » 06 avr. 2006, 10:31

Mais j'ai un denrier souci, pour qu'il prenne en compte 2 photos, j'ai tout simplement remis ceci :

Code : Tout sélectionner

<tr> <td colspan="2"> <p align="center"><input type="file" name="aFile" /> </p> </td> </tr>
donc 2 fois , j'ai bien le parcourir 2 fois mais qu'une seule image est envoyé....
C'est normal, il te faut donner un nom différent au champ contenant ton second fichier (sinon faut utiliser un tableau, mais si tu n'as que deux fichiers, on va faire simple ;)).

En fait, de même que tu va retrouver tous tes champs habituels dans $_POST, tu vas retrouver tous tes fichiers dans $_FILES. Tu dois donc distinguer $_FILES['fichier_1'] (en l'occurence ton 'aFile') et $_FILES['fichier_2'] (ton éventuel second fichier)

Naturellement tout le code testant la récupération du fichier, la taille, le copiant et le renommant doit être doublée et adaptée pour ton 2ème fichier :
if ($_FILES['aFile']['error'] == UPLOAD_ERR_OK) { 
  // vérifie la taille en octets 
  if ($_FILES['aFile']['size'] <= $file_max_size) { 
    ...
  }
}
if ($_FILES['fichier_2']['error'] == UPLOAD_ERR_OK) { 
  // vérifie la taille en octets 
  if ($_FILES['fichier_2']['size'] <= $file_max_size) { 
    ...
  }
}

par mfrancky » 05 avr. 2006, 23:17

petit up :D

Un éclair de génie

par mfrancky » 04 avr. 2006, 23:09

On a beau avoir la solution sous ces yeux, on cherche toujours midi à 14H, le seul truc à modifier c'etait bien le Isset du bouton de soumission qui etait resté par défaut et que j'ai modifié par ma valeur et bien sur ca marche impeccable.

Mais j'ai un denrier souci, pour qu'il prenne en compte 2 photos, j'ai tout simplement remis ceci :

Code : Tout sélectionner

<tr> <td colspan="2"> <p align="center"><input type="file" name="aFile" /> </p> </td> </tr>
donc 2 fois , j'ai bien le parcourir 2 fois mais qu'une seule image est envoyé....

par Ryle » 04 avr. 2006, 21:09

la méthode isSet te permet simplement de tester si une variable est définie ou non, elle te permet donc entre autre de tester si le formulaire à bien été renseigné :
$var1 = "toto";
isSet($var1); // vrai
isSet($var2); // faux 
Dans ton cas, il suffit de reprendre la partie de ton code testant si $_FILES est défini pour savoir qu'un fichier est envoyé, mais il faut bien sur reprendre tout le reste du code :
if(isset($_POST['soumission'])) { 
  if(isset($_POST['pseudo']))      $pseudo=$_POST['pseudo']; 
  else      $pseudo=""; 
  // à noter que tu peux aussi l'écrire comme ça :
  $pseudo = (isset($_POST['pseudo'])) ? $_POST['pseudo'] : ""; // c'est la meme chose que ton if else, mais ca prend moins de place ;)
  $mail = (isset($_POST['mail'])) ? $_POST['mail'] : "";

// toute la partie récup du fichier

  /** 
   * function formatFileName 
   * @access public 
   * @param string - nom de fichier à formater 
   * @param int - longueur maximale autorisée pour le nom de fichier 
   * @return string - nom de fichier formaté 
   * @desc Tronque éventuellement le nom de fichier, le convertit en minuscules et 
   *           y élimine les caractères potentiellement dangereux. 
   */ 
   function formatFileName($aFileName, $aMaxLength = 50) { 
     $aFileName = strToLower(subStr($aFileName, 0, $aMaxLength)); 
     $aFileName = ereg_replace('[^a-zA-Z0-9,._\+\()\-]', '_', $aFileName); 

     return $aFileName; 
   } // end of function formatFileName() /2 

   /* PARAMETRES DE CONFIGURATION DU SCRIPT */ 

   // chemin d'accès au répertoire d'upload (vers où le fichier uploadé temporaire sera transféré) 
   // ce répertoire doit EXISTER et être ACCESSIBLE EN ECRITURE !! 
   $destination_dir = '/var/www/free.fr/5/e/borderterrier/upload'; 
   // taille maximale en octets du fichier à uploader 
   $file_max_size = 10000; 
   // extensions de fichiers autorisées 
   $authorized_extensions = array('jpg', 'gif'); 

   /* TRAITEMENT PRINCIPAL */ 

   // vérifie l'existence du répertoire de destination 
   if (!is_dir($destination_dir)) { 
     echo 'Veuillez indiquer un r&eacute;pertoire destination correct !'; 
     die(); 
   } 

   // vérifie que répertoire de destination a des droits en écriture 
   if (!is_writeable($destination_dir)) { 
     echo 'Veuillez spécifier des droits en écriture pour le r&eacute;pertoire destination !'; 
     die(); 
   } 


  if (isSet($_FILES) && is_array($_FILES)) { 
    ...
  }
Sinon pour le html, c'est bien ce que je disais tes input file et submit sont dans le tableau, mais pas dans une cellule :

Code : Tout sélectionner

<tr> <td><p align="center">Photo :</p></td> <td><input type="file" name="aFile" /></td> </tr> <tr> <td colspan="2"> <input type="submit" name="soumission" value="Tout Envoyer" /> </td> </tr> </table>

par mfrancky » 04 avr. 2006, 20:45

Oui je te confirme c'est bien parce qu'on ne voit pas tout sinon ca donne ceci

Code : Tout sélectionner

<tr> <td><p align="center">Pseudo :</p></td> <td> <p align="center"><input type="text" name="pseudo" size="25"></p></td> </tr> <tr> <td><p align="center">e-mail :</p></td> <td><p align="center"><input type="text" name="mail" size="25"></p></td> </tr> <tr> <td><p align="center">Objet :</p></td> <td><p align="center"><input type="text" name="sujet" size="25"></p></td> </tr> <tr> <td><p align="center">Votre message :</p></td> <td><p align="center"><textarea name="message" rows="4" cols="40"></textarea></p></td> </td> </tr> <tr> <td><p align="center">Photo :</p></td> <input type="file" name="aFile" /> <input type="submit" name="soumission" value="Tout Envoyer" /> </table> </form>
Mais sinon je ne connais pas trop Isset donc tu n'aurais pas une idée sur si $f_FILES ou $_ POST et le nom d ela variable?

Sinon je vais tester, j te trouverais bien a force.

De tout maniere, je te remercie car c'est cool de se dire qu'on ets pas tout seul dans l'apprentissage.

par Ryle » 04 avr. 2006, 19:06

Ah ben forcément, coté php, faut rajouter également toute la gestion d'image que tu nous a montré jusque là :) (en l'adaptant naturellement, si le nom du bouton submit change ("soumission" au lieu de "submitfile"), il faut aussi changer le test côté php :)

pis juste une remarque sur ton code (même si c'est peut etre juste parce qu'on ne voit pas tout) :

Code : Tout sélectionner

<td><p align="center">Photo :</p></td> <input type="file" name="aFile" /> <input type="submit" name="soumission" value="Tout Envoyer" />
C'est pas bien de laisser trainer des input comme ca, errer au milieu d'un <table>. Il faut faire ca proprement et créer une ligne (<tr>) et une ou des cellules (<td> ou <th>) dans lesquelles tu mettras tes champs et boutons :)

par mfrancky » 04 avr. 2006, 18:54

Alors voila j'ai fait comme tu m'as dit :

Code : Tout sélectionner

<td><p align="center">Votre message :</p></td> <td><p align="center"><textarea name="message" rows="4" cols="40"></textarea></p></td> </td> </tr> <tr> <td><p align="center">Photo :</p></td> <input type="file" name="aFile" /> <input type="submit" name="soumission" value="Tout Envoyer" />
Mais voila je recois bien le message mais la photo n'est pas uploadé, pour moi c'est logique vu que pour le formulaire j'ai ceci

Code : Tout sélectionner

if(isset($_POST['soumission'])) { if(isset($_POST['pseudo'])) $pseudo=$_POST['pseudo']; else $pseudo=""; if(isset($_POST['mail'])) $mail=$_POST['mail']; else $mail="";
donc forcement je dois avoir aussi un isset mais je ne vois pas si je met FILES ou POST et si je met comme variable aFile ou aFileName ou autre.

Merci.

par mfrancky » 04 avr. 2006, 17:04

Je vais tenter ca, j'espere que tu repasseras demain car a mon avis j'aurais un probléme :).

par Ryle » 04 avr. 2006, 16:53

Voir mon message ci dessus, il te suffit de tout mettre dans le meme formulaire :)

Code : Tout sélectionner

<form name="form" method="post" action="..." enctype="multipart/form-data"> Nom <input type="text" name="nom" /> Prénom <input type="text" name="prenom" /> ... Fichier <input type="file" name="aFile" /> <input type="submit" name="submitAll" value="Tout Envoyer" /> </form>

par mfrancky » 04 avr. 2006, 16:42

okok.

Mais vois tu une solution pour que mon envoi de formulaire soit complementaire avec mon envoi de photos?

En gros, que le bouton soumission valide les champs de mon formulaire par mail et les photos dans le dossier upload?

par Ryle » 04 avr. 2006, 16:23

C'est une constante que tu utilises dans ton code :)
Une fois tous les tests accomplis avec succès, tu déplaces le fichier dans le répertoire de destination :
if (move_uploaded_file($_FILES['aFile']['tmp_name'], $destination_dir.DIRECTORY_SEPARATOR.$destination_file)) { 
  echo 'Fichier valide et upload&eacute; correctement.'; 
}
// Avec pour valeur 
$destination_dir = '/var/www/free.fr/5/e/borderterrier/upload';
$destination_file = time().formatFileName($_FILES['aFile']['name']);
DIRECTORY_SEPARATOR = ??? // non défini (ou alors chépasoù) donc vide
Donc à première vue, au lieu de déplacer le fichier dans
/var/www/free.fr/5/e/borderterrier/upload/ en le nommant "NomDuFichier"
Il doit essayer de le déplacer dans le dossier
/var/www/free.fr/5/e/borderterrier/ en le nommant "uploadNomDuFichier"

Il faudrait donc ajouter un slash dans ta varibale $destination_dir ou bien ajouter la définission de cette constante :
define("DIRECTORY_SEPARATOR", "/");

Edit : et pour envoyer tes champs en meme temps que ton image, il te suffit de tout mettre dans le meme formulaire <form></form> (celui avec le enctype pour pouvoir récuperer le fichier), et il te suffira d'un seul bouton submit pour envoyer le tout :)

par mfrancky » 04 avr. 2006, 16:13

Pour larbo oui je comprends mais alors pour la 1ere moitié de ta réponse, je suis comme qui dirait...Largué :D

par Ryle » 04 avr. 2006, 16:03

Il ne "faut" pas le action, mais c'est quand même mieux de le mettre ;)

A priori, je dirais que le problème provient de la constante DIRECTORY_SEPARATOR qui n'est pas défini dans ton code... (et vu que ta variable $destination_dir ne se termine pas par un "/" il doit pas trop s'y retrouver...

J'en profiterais d'ailleurs pour modifier le $destination_dir en mettant un chemin relatif à partir du script (genre "../upload" tout dépend où est ton script par rapport au dossier upload) pour ne pas dépendre de l'arbo free :)

par mfrancky » 04 avr. 2006, 15:57

Bonjour,

Non tu n'as pas revé car j'ai effectivement bien supprimé le message car en fait j'ai augmenté le $file_max_size = 100000000 et ca passe puisque 1000 signifiait 1000 octets donc 1Ko donc trop peu pour une photo.

Effectivement ca marche mais voila, j'ai un formulaire qui va avec , voir http://borderterrier.free.fr/contact.php et j'aimerais que la photo soit envoyé en meme temps que le message, donc qu'elle reste en cache et que le bouton de soumission valide la photo + le message.

J'avoue ne pas voir comment faire.