Page 1 sur 2

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

Posté : 04 avr. 2006, 12:47
par mfrancky
Bonjour,

Je suis passé sur le site ou j'ai lu le tutorial, j'ai fait une page test.php pour m'assurer avant de l'integrer à mon formulaire avoir bien compris le principe.

Malheureusement, ce n'est pas le premier script que je récupere mais le votre est bien plus complet mais il y a toujours la même erreur.

Le fichier visiblement s'upload puisque la barre de chargement augmente et qu'a la fin du chargement , la page m'indique terminé mais je n'ai aucun message m'infirmant que le fichier a bien été uploadé (1er souci) mais surtout le fichier n'est pas dans le dossier et je ne vois vraiment pas ou le probléme.

Free autorise bien l'upload, je l'ai verifié par le script phpinfo() et j'ai mis bien le repertoire upload en ecriture et lecture pour tout le monde, pour les fichiers et sous dossiers.

Je vous joint le code :
<!doctype html public "-//W3C//DTD HTML 4.0 //EN"> 
<html>
<head>
       <title>Title here!</title>
</head>
<body>
<form name="form" method="post" enctype="multipart/form-data">
   <!-- Taille maximale en octets. Non sécurisé car facilement contournable !! -->
   <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
   Veuillez s&eacute;lectionner un fichier &agrave; uploader:
   <input type="file" name="aFile" />
   <input type="submit" name="submitFile" value="Envoyer le fichier" />
</form>
<?php
  /**
   * 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();
   }

   // réception du formulaire
   if (isSet($_POST['submitFile'])) {

     // vérifie qu'un fichier a bien été soumis
     if (isSet($_FILES) && is_array($_FILES)) {

       // pas d'erreur lors de l'upload
       if ($_FILES['aFile']['error'] == UPLOAD_ERR_OK) {

         // vérifie la taille en octets
         if ($_FILES['aFile']['size'] <= $file_max_size) {

           // vérifie l'extension du fichier recu
           // il est aussi possible (et sans doute mieux) de se baser sur $_FILES['aFile']['type']
           // qui retourne le type MIME correspondant (par exemple: image/pjpeg)
           $lastPos = strRChr($_FILES['aFile']['name'], ".");
           if ($lastPos !== false && in_array(strToLower(subStr($lastPos, 1)), $authorized_extensions)) {

             // définit un nom de fichier destination unique à partir du nom du fichier original formaté
             $destination_file = time().formatFileName($_FILES['aFile']['name']);

             // déplace le fichier uploadé du répertoire temporaire
             // vers les répertoire/fichier destination spécifiés
             if (move_uploaded_file($_FILES['aFile']['tmp_name'],
                                         $destination_dir.DIRECTORY_SEPARATOR.$destination_file)) {
               echo 'Fichier valide et upload&eacute; correctement.';
             } else { // error sur move_uploaded_file
               echo 'Le fichier n\'a pas &eacute;t&eacute; upload&eacute; correctement !';
             }
           } else { // pas d'extension ou mauvaise extension
             echo 'Mauvaise extension !';
           }
         } else { // Taille maximale dépassée
           echo 'Fichier trop volumineux !';
         }
       } else { // Erreur lors de l'upload
         switch ($_FILES['aFile']['error']){
           case UPLOAD_ERR_INI_SIZE:
              echo 'Le fichier upload&eacute; d&eacute;passe la valeur sp&eacute;cifi&eacute;e
                       pour upload_max_filesize dans php.ini.';
              break;
           case UPLOAD_ERR_FORM_SIZE:
              echo 'Le fichier upload&eacute; d&eacute;passe la valeur sp&eacute;cifi&eacute;e
                       pour MAX_FILE_SIZE dans le formulaire d\'upload.';
              break;
           case UPLOAD_ERR_PARTIAL:
              echo 'Le fichier n\'a &eacute;t&eacute que partiellement upload&eacute;.';
              break;
           default:
              echo 'Aucun fichier n\'a &eacute;t&eacute upload&eacute;.';
         } // switch
       }
     } else { // aucun fichier reçu
       echo 'Pas de fichier recu';
     }
   } // fin de réception de formulaire
?>
</body>
</html>
Vous pouvez essayer sur la page borderterrier.free.fr/test.php

Je précise que la seule chose que j'ai modifier est le fait d'avoir supprimé le action="page_receptrice.php" du formulaire pour que les erreus s'affichent sur la meme page et non sur une autre.

Comment s'assurer que le CHMOD est bien pris en compte car j'utilise FlashFTP et j'ai beau mettre les droit d'ecritures , lorsque je refais proprietes, il me remet les paramatres par défaut soit 700.

Merci.

Posté : 04 avr. 2006, 15:15
par goeb
Salut,

il faut le "action=...". meme si c'est le meme script.

et je vois pas où est ton chmod dans le PHP.

Posté : 04 avr. 2006, 15:49
par jpaul
Je ne sais pas ce qu'il en est aujourd'hui mais à une époque, l'upload, chez free était limité à 200K...
Essaye avec un petit fichier < 200 K pour voir...

Ceci dit je crois me rappeler que j'étais arrivé à contourner le problème en découpant le fichier en plusieurs petits fichiers et en les concaténant au téléchargement.


Hum !!!
J'ai rêvé quand j'ai vu qu'il était question d'un fichier d'1 Mo ou bien il y a eu une suppression d'une réponse ?


Je viens de faire un test sur ta page avec un petit fichier et ça m'a mis :

Code : Tout sélectionner

Veuillez sélectionner un fichier à uploader: Fichier valide et uploadé correctement.

Posté : 04 avr. 2006, 15:57
par mfrancky
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.

Posté : 04 avr. 2006, 16:03
par Ryle
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 :)

Posté : 04 avr. 2006, 16:13
par mfrancky
Pour larbo oui je comprends mais alors pour la 1ere moitié de ta réponse, je suis comme qui dirait...Largué :D

Posté : 04 avr. 2006, 16:23
par Ryle
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 :)

Posté : 04 avr. 2006, 16:42
par mfrancky
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?

Posté : 04 avr. 2006, 16:53
par Ryle
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>

Posté : 04 avr. 2006, 17:04
par mfrancky
Je vais tenter ca, j'espere que tu repasseras demain car a mon avis j'aurais un probléme :).

Posté : 04 avr. 2006, 18:54
par mfrancky
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.

Posté : 04 avr. 2006, 19:06
par Ryle
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 :)

Posté : 04 avr. 2006, 20:45
par mfrancky
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.

Posté : 04 avr. 2006, 21:09
par Ryle
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>

Un éclair de génie

Posté : 04 avr. 2006, 23:09
par mfrancky
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é....