[PHP] Upload de fichier presque fonctionnel (presk...)

Upload de fichier presque fonctionnel (presk...) [PHP] - PHP - Programmation

Marsh Posté le 05-08-2006 à 19:37:34    

Bonsoir,
 
voilà je tente de créer un formulaire qui permette l'envoi d'images .jpg ou .jpeg uniquement, ne dépassant pas les 50Ko, avec affichage des erreurs en cas de non-respect de ces règles ou envoi de formulaire vide.
Il marchait correctement jusqu'à ce que je rajoute un elseif pour la taille maxi.
 
Maintenant, il repère correctement une taille trop élevée et un format d'image interdit, mais m'interdit également aussi l'upload de .jpg et .jpeg :/
 
J'ai beau chercher, je ne vois pas d'où vient l'erreur.
Alors... merci d'avance à qui trouvera le pb (je précise que je débute en php :o)
 
Voici mon code :

Code :
  1. <?php
  2. $nom_fichier = $_FILES['fichier']['name'];
  3. $nom_fichier_temp = $_FILES['fichier']['tmp_name'];
  4. $nom_fichier_size = $_FILES['fichier']['size'];
  5. $nom_fichier_type = $_FILES['fichier']['type'];
  6. $taille_max = 50176;
  7. if (isset($_POST['upload']))
  8. {
  9. if ($nom_fichier_size==0)
  10. {
  11.  $message_erreur = '<br />L\'upload a échoué. Veuillez choisir une image.<br />';
  12. /* switch($i)
  13. {
  14. case 0:
  15.             echo
  16. }*/
  17. }
  18. elseif($nom_fichier_size > $taille_max)/
  19. {
  20.  $message_erreur = '<br />Seuls les fichiers de moins de 50Ko sont acceptés';
  21. }
  22. elseif (!stristr($nom_fichier_type, 'jpg') || !stristr($nom_fichier_type, 'jpeg'))//stristr est semblable à strstr, mais n'est pas sensible à la casse
  23. {
  24.  $message_erreur = '<br />Seules les images de type .jpg et .jpeg sont admises.<br />';
  25. }
  26. else
  27. {
  28.  $nom_destination = 'fichiers/';
  29.  $nom_destination .= $nom_fichier;//sinon $destination vaut fichiers/$_FILES['fichier']['name']
  30.  $size = $nom_fichier_size;
  31.  move_uploaded_file($nom_fichier_temp, $nom_destination);
  32.  echo 'Le fichier '.$nom_fichier.' a été correctement uploadé <p>';
  33.  echo 'Il pèse '.$nom_fichier_size.' Octets';
  34.  echo '<p>Aperçu :<p>';
  35.  readfile($nom_destination);
  36. }
  37. }
  38. ?>
  39. <form method="post" action="file_upload_en_un_seul_fichier.php" enctype="multipart/form-data" name="formulaire">
  40. <fieldset>
  41. <legend>Envoi de fichier</legend>
  42. <label for="photo">Chemin :</label>
  43. <input type="file" name="fichier" size="30"><p>
  44. <input type="submit" name="upload" value="Uploader">
  45. <?php
  46. echo $_GET = stripslashes($message_erreur);//afficher sans les antislashes le message d'erreur transmis par GET
  47. ?>
  48. </fieldset>
  49. </form>


Message édité par Donzeky le 06-08-2006 à 15:46:25
Reply

Marsh Posté le 05-08-2006 à 19:37:34   

Reply

Marsh Posté le 05-08-2006 à 20:06:04    

Tu as des tests qui me font un peu peur comme celui de la ligne 8, et tu as oublier un champ à la ligne 45
 
Voici un tutorial : http://www.phpfrance.com/tutoriaux [...] e-fichiers
 
Ca devrait t'aider.

Reply

Marsh Posté le 06-08-2006 à 15:45:32    

AlphaZone a écrit :

Tu as des tests qui me font un peu peur comme celui de la ligne 8, et tu as oublier un champ à la ligne 45
 
Voici un tutorial : http://www.phpfrance.com/tutoriaux [...] e-fichiers
 
Ca devrait t'aider.


Merci pour ta réponse.
 
J'ai rajouté </fieldset>, le champs label (c'était ça qui manquait :??:).
J'ai aussi remplacé le  
if ($_POST['upload'])
par
if (isset($_POST['upload'])).
Mais ça ne change rien...
 
Je crois que je vais carrément reprendre depuis le début, en faisant autrement.
 
 
 
EDIT : code modifié dans le premier message

Message cité 1 fois
Message édité par Donzeky le 06-08-2006 à 15:46:49
Reply

Marsh Posté le 06-08-2006 à 16:05:40    

Donzeky a écrit :


J'ai rajouté </fieldset>, le champs label (c'était ça qui manquait :??:).


 
Non c'est un champ de type hidden qui te permet de fixé la taille max des fichiers envoyés.

Reply

Marsh Posté le 06-08-2006 à 18:14:02    

Mais le fait de spécifier la taille max par :

Code :
  1. elseif($nom_fichier_size > $taille_max)
  2. $nom_fichier_size
  3. vaut
  4. $_FILES['fichier']['size']
  5. et où
  6. $taille_max
  7. vaut
  8. 50176


ne suffit pas  :??:
Ou bien c'est moins "conseillé" ?

Reply

Marsh Posté le 06-08-2006 à 18:54:54    

Et non, malheureusement cela ne suffit pas. Je pense que tu as compris que je parlais du champ hidden nommé MAX_FILE_SIZE.
Voici un article très intéressant, je pense que cela devrait t'aidé dans la compréhension : http://www.nexen.net/index.php?opt [...] method.php
 
Extrait de la partie concerné :

Citation :

Le champs caché MAX_FILE_SIZE  (mesuré en octets) doit précédé le champ input de type file et sa valeur représente la taille maximale acceptée du fichier. Ceci est considéré comme un conseil pour le navigateur, bien que PHP l'utilise également. Il est très facile de contourner cette restriction. Ne comptez pas sur le respect de cette configuration par le navigateur! La configuration de PHP sur la taille maximale à respecter ( upload_max_filesize ) ne peut être contournée, elle. Vous devez ajouter la variable MAX_FILE_SIZE  à votre formulaire dans tous les cas car il prévient le chargement de gros fichiers qui demanderait un long délai d'attente au client et ainsi fera échouer le script.


 
 
Autre précision sur ton code :

Code :
  1. $nom_fichier = $_FILES['fichier']['name'];
  2. $nom_fichier_temp = $_FILES['fichier']['tmp_name'];
  3. $nom_fichier_size = $_FILES['fichier']['size'];
  4. $nom_fichier_type = $_FILES['fichier']['type'];
  5. $taille_max = 50176;


 
Tu devrais faire cela SI et SEULEMENT SI tu es sûr qu'un fichier a été uploadé, sinon cela risque d'afficher des messages d'erreur sur ta page. C'est un peu gênant pour le visiteur et peut-être un plus pour un pirate de passage :D

Message cité 1 fois
Message édité par AlphaZone le 06-08-2006 à 18:59:32
Reply

Marsh Posté le 06-08-2006 à 19:30:04    

AlphaZone a écrit :


Autre précision sur ton code :

Code :
  1. $nom_fichier = $_FILES['fichier']['name'];
  2. $nom_fichier_temp = $_FILES['fichier']['tmp_name'];
  3. $nom_fichier_size = $_FILES['fichier']['size'];
  4. $nom_fichier_type = $_FILES['fichier']['type'];
  5. $taille_max = 50176;


 
Tu devrais faire cela SI et SEULEMENT SI tu es sûr qu'un fichier a été uploadé, sinon cela risque d'afficher des messages d'erreur sur ta page. C'est un peu gênant pour le visiteur et peut-être un plus pour un pirate de passage :D


Pour cela j'avais mis :

Code :
  1. if (isset($_POST['upload']))
  2. --> Sinon réafficher le formulaire avec le message d'erreur :
  3. "Veuillez choisir une image".


Mais après, est-ce suffisant pour la sécurité... de toute façon je lis les liens que tu m'as donnés et meme plus, et teste diférentes méthodes :)

Reply

Marsh Posté le 07-08-2006 à 07:20:43    

Justement niveau sécurité ce n'est pas au top, tu vérifi simplement que le formulaire a été envoyé or tu ne sais pas si ton champ fichier a été saisi.
 
Il faut que tu vérifi si le champ fichier a été défini et qu'il n'est pas vide : if(isset() && !empty(...))

Reply

Marsh Posté le 07-08-2006 à 10:27:05    

il suffit de verifier la taille du tableau $_FILES  
au passage, il vaut mieux eviter de tester sur le bouton submit , il me semble que si on se sert de entrer pour valider le formulaire la variable n'est pas passé ( sous IE 6 )  
 
le pluis propre est d'utiliser un champ hidden pour checker si on est passer par le formulaire ou pas

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed