Valider taille fichier avant upload
Fermé
secropia1313
Messages postés
16
Date d'inscription
samedi 2 juin 2012
Statut
Membre
Dernière intervention
5 octobre 2018
-
2 nov. 2012 à 19:14
maverick - 5 nov. 2012 à 20:13
maverick - 5 nov. 2012 à 20:13
A voir également:
- Valider taille fichier avant upload
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
13 réponses
Le message d'erreur vient du fait que la variable serait vide ...! C'est normal que la variable soit vide on bloque le fichier s'il est trop gros. Je devrais trouvé un truc d'ici peut.
Bonsoir,
'' Notice: Undefined index: ... '' n'est pas un message d'erreur SQL mais PHP et pour afficher un message d'avertissement à l'utilisateur par rapport au poids du fichier téléchargé, il faut juste ajouter un else à ta condition qui teste le poids de ce fichier :
ATTENTION lorsque que l'on manipule le téléchargement de fichiers aux directives contenues dans le fichier php.ini
Pour ce qui est de l'extension du fichier .txt je n'est pas trop compris ce que tu voulais faire sauf que je te recommande vivement de vérifier à l'aide d'une condition que le fichier est autorisé à être télécharger sinon tu risques de te retrouver face à une personne malhonnête qui pourrait utiliser cette faille pour télécharger sur ton serveur un programme malveillant.
'' Notice: Undefined index: ... '' n'est pas un message d'erreur SQL mais PHP et pour afficher un message d'avertissement à l'utilisateur par rapport au poids du fichier téléchargé, il faut juste ajouter un else à ta condition qui teste le poids de ce fichier :
<?php $target = "images/recettes/"; $target .= basename($_FILES['image_recette']['name']); $nom_final = preg_replace("'.txt'is",date("U").".txt", $target); if(filesize($_FILES['image_recette']['tmp_name'])<101200) { move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final); echo "The file ". basename( $_FILES['image_recette']['name']). " has been uploaded"; } else { echo "Sorry, there was a problem uploading your file."; } else { echo "Sorry, your file exceeds the size limit of 101200Ko"; } ?>
ATTENTION lorsque que l'on manipule le téléchargement de fichiers aux directives contenues dans le fichier php.ini
Pour ce qui est de l'extension du fichier .txt je n'est pas trop compris ce que tu voulais faire sauf que je te recommande vivement de vérifier à l'aide d'une condition que le fichier est autorisé à être télécharger sinon tu risques de te retrouver face à une personne malhonnête qui pourrait utiliser cette faille pour télécharger sur ton serveur un programme malveillant.
<?php $target = "images/recettes/"; $target .= basename($_FILES['image_recette']['name']); $nom_final = preg_replace("'.txt'is",date("U").".txt", $target); if(filesize($_FILES['image_recette']['tmp_name'])<101200) { if(move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final)) { echo "The file ". basename( $_FILES['image_recette']['name']). " has been uploaded"; } else { echo "Sorry, there was a problem uploading your file."; } } else { echo "Sorry, your file exceeds the size limit of 101200Ko"; } ?>
Merci du conseil je vais assurément l'appliqué.
Par contre, pour le code il ne fonctionne pas dans sa forme actuel. Le message d'erreur à changer maintenant, on a un simple '' Parse error: syntax error, unexpected 'else' (T_ELSE) in ''
D'habitude je règle ces problèmes mais l'à je suis un peu perdu. Déjà qu'il y a deux else pour un if. Je vais revoir mes bases.
À tu une idée pourquoi j'ai une erreur de else.
Pour le txt...C'est que dans le code actuel un '' timestamp '' est ajouté avant l'extension .txt. Mais moi j'aimerais que ce '' timestamp ''( qui n'en est pas vraiment un ) s'applique à tout les genres de fichier.
Merci
Par contre, pour le code il ne fonctionne pas dans sa forme actuel. Le message d'erreur à changer maintenant, on a un simple '' Parse error: syntax error, unexpected 'else' (T_ELSE) in ''
D'habitude je règle ces problèmes mais l'à je suis un peu perdu. Déjà qu'il y a deux else pour un if. Je vais revoir mes bases.
À tu une idée pourquoi j'ai une erreur de else.
Pour le txt...C'est que dans le code actuel un '' timestamp '' est ajouté avant l'extension .txt. Mais moi j'aimerais que ce '' timestamp ''( qui n'en est pas vraiment un ) s'applique à tout les genres de fichier.
Merci
Nhay
Messages postés
838
Date d'inscription
vendredi 2 novembre 2012
Statut
Membre
Dernière intervention
17 décembre 2015
126
3 nov. 2012 à 12:57
3 nov. 2012 à 12:57
Vérifie que tu n'a pas mal copier, je ne vois pas d'erreur pour ma part, et il n'y as pas deux else pour un if, il y as deux if distinct, chacun ayant sont else, tu as peut-être zappé une accolade pour le coup.
Oui un if viens de ce rajouter, donc, j'ai recopié le code et cela fonctionnais presque. J'ai remplacé le plus petit que.. pour un plus grand que... Donc, un > à la place du <.
Ce que j'ai de la misère à comprendre c'est que quand le fichier est petit il n'y a aucun problème mais quand le fichier est volumineux le message "Sorry, your file exceeds the size limit of 101200Ko" s'affiche, jusque l'à super, mais il affiche aussi deux erreurs du genre '' Notice: Undefined index: image_recette in... ''. J'ai bien essayé de corriger mais je trouve très bizarre que j'ai un code d'erreur pour une situation et pas pour l'autre..C'est '' impossible ''. car c'est le même serveur même bout de code...
je continue mes recherche mais présentement je suis dans une impasse.
Ce que j'ai de la misère à comprendre c'est que quand le fichier est petit il n'y a aucun problème mais quand le fichier est volumineux le message "Sorry, your file exceeds the size limit of 101200Ko" s'affiche, jusque l'à super, mais il affiche aussi deux erreurs du genre '' Notice: Undefined index: image_recette in... ''. J'ai bien essayé de corriger mais je trouve très bizarre que j'ai un code d'erreur pour une situation et pas pour l'autre..C'est '' impossible ''. car c'est le même serveur même bout de code...
je continue mes recherche mais présentement je suis dans une impasse.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai parlé trop vite pour les signes <> cela cause des problèmes du coté des petits fichiers !!. Le code ne fonctionnais pas à cause du if qui a maintenant été ajouté et maintenant il ne fonctionne pas parce que ce n'est pas le bon message qui s'affiche.
Quand j'ai un fichier trop gros il affiche le message '' Sorry, there was a problem uploading your file. '' au lieu de l'autre. J'ai tout simplement inversé les messages et maintenant tout fonctionne comme prévue mais je ne sait pas si c'est propre.
Je reviens avec un code complet comprenant la suggestion plus que pertinent de ReDLoG pour les .exe.
p.s. pour le message d'erreur je vais ajouter un '' error_reporting(E_ALL & ~E_NOTICE); '' qui me semble correct dans cette situation. Pour le développement par contre je vais laisser les messages d'erreurs apparaitre.
Ma seul préoccupation est de ne pas savoir si error_reporting effectue des changements réelles dans le php.ini de façon permanente.
Merci
Quand j'ai un fichier trop gros il affiche le message '' Sorry, there was a problem uploading your file. '' au lieu de l'autre. J'ai tout simplement inversé les messages et maintenant tout fonctionne comme prévue mais je ne sait pas si c'est propre.
Je reviens avec un code complet comprenant la suggestion plus que pertinent de ReDLoG pour les .exe.
p.s. pour le message d'erreur je vais ajouter un '' error_reporting(E_ALL & ~E_NOTICE); '' qui me semble correct dans cette situation. Pour le développement par contre je vais laisser les messages d'erreurs apparaitre.
Ma seul préoccupation est de ne pas savoir si error_reporting effectue des changements réelles dans le php.ini de façon permanente.
Merci
Nhay
Messages postés
838
Date d'inscription
vendredi 2 novembre 2012
Statut
Membre
Dernière intervention
17 décembre 2015
126
3 nov. 2012 à 16:18
3 nov. 2012 à 16:18
error_reporting ne fonctionne que pendant la durée d'exécution du script, il ne change donc pas le fichier php.ini
Bon voici le code final. ( Merci à vous deux pour votre contribution )
Le formulaire d'upload suivant permet au client de choisir son fichier à uploader :
Et voici le code qui va traiter le fichier. Il va :
. enlever les espaces,
. ajouter un timestamp avant le nom du fichier,
pour s'assurer qu'il n'y ai pas deux fichiers identiques,
. vérifier qu'il ne dépasse pas un certain poids,
. un '' error_reporting(E_ALL & ~E_NOTICE); '' pour que le message d'erreur au sujet d'un fichier inexistent ne s'affiche pas quand le fichier est trop volumineux.
( je suggère de l'enlever pendant votre développement )
. Placer le fichier dans le dossier approprié.
N.B. Je n'ai pas inclue un contrôle de fichier malveillant pour l'instant. Cela sera absolument nécessaire. Et je penserai à repasser pour mettre à jour le code quand il sera fait.
Voilà, le code est fonctionnel mais surement pas parfait, si quelqu'un veut l'améliorer je le testerai pour confirmer.
Merci
Le formulaire d'upload suivant permet au client de choisir son fichier à uploader :
<form enctype="multipart/form-data" action="t_up.php" method="POST"> <p> <label for="image"> Photo de la recette </label> <br /> <input type="file" id="image" name="image_recette" /> </p> <p> <input type="submit" name="valider" value="Envoyez" /> </p> </form>
Et voici le code qui va traiter le fichier. Il va :
. enlever les espaces,
. ajouter un timestamp avant le nom du fichier,
pour s'assurer qu'il n'y ai pas deux fichiers identiques,
. vérifier qu'il ne dépasse pas un certain poids,
. un '' error_reporting(E_ALL & ~E_NOTICE); '' pour que le message d'erreur au sujet d'un fichier inexistent ne s'affiche pas quand le fichier est trop volumineux.
( je suggère de l'enlever pendant votre développement )
. Placer le fichier dans le dossier approprié.
N.B. Je n'ai pas inclue un contrôle de fichier malveillant pour l'instant. Cela sera absolument nécessaire. Et je penserai à repasser pour mettre à jour le code quand il sera fait.
<?php error_reporting(E_ALL & ~E_NOTICE); $time = time(); $tmp= basename($_FILES['image_recette']['name']); $target = "images/recettes/"; $target .= $time.$tmp; $nom_final = preg_replace ("' 'i","",$target); if(filesize($_FILES['image_recette']['tmp_name'])<101200) { if(move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final)) { echo "Le fichier ". basename( $_FILES['image_recette']['name'])." a bien été transferé"; } else { echo "Désolé le fichier excède la limite permise"; } } else { echo "Désolé, il y eu un problème lors du transfert"; } ?>
Voilà, le code est fonctionnel mais surement pas parfait, si quelqu'un veut l'améliorer je le testerai pour confirmer.
Merci
Bonjour,
j'ai ajouté une vérification de l'extension pour ne pas qu'un pirate upload un fichier php. Par contre, par la suite je n'arrive pas à faire afficher le message "Désolé le fichier excède la limite permise". Pourtant je vérifié l'ordre des if et else plusieurs fois et tout me semble correct.
Est-ce que vous avez une idée.
Voici le code :
j'ai ajouté une vérification de l'extension pour ne pas qu'un pirate upload un fichier php. Par contre, par la suite je n'arrive pas à faire afficher le message "Désolé le fichier excède la limite permise". Pourtant je vérifié l'ordre des if et else plusieurs fois et tout me semble correct.
Est-ce que vous avez une idée.
Voici le code :
<?php $tabExt = array('jpg','gif','png','jpeg'); // Extensions autorisees $infosImg = array(); $extension = ''; error_reporting(E_ALL & ~E_NOTICE); $time = time(); $tmp= basename($_FILES['image_recette']['name']); $target = "images/recettes/"; $target .= $time.$tmp; $nom_final = preg_replace ("' 'i","",$target); if(filesize($_FILES['image_recette']['tmp_name'])<101200) { // Recuperation de l'extension du fichier $extension = pathinfo($_FILES['image_recette']['name'], PATHINFO_EXTENSION); // On verifie l'extension du fichier if(in_array(strtolower($extension),$tabExt)) { if(move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final)) { echo "Le fichier ". basename( $_FILES['image_recette']['name'])." a bien été transferé"; } else { echo "Désolé, il y eu un problème lors du transfert"; } } else { echo "Désolé, ce fichié n'est pas une image "; } } else { echo "Désolé le fichier excède la limite permise"; }
Nhay
Messages postés
838
Date d'inscription
vendredi 2 novembre 2012
Statut
Membre
Dernière intervention
17 décembre 2015
126
5 nov. 2012 à 17:54
5 nov. 2012 à 17:54
if(filesize($_FILES['image_recette']['tmp_name'])<101200)
Fonctionnerait peut-être mieux comme ça :
if(filesize($_FILES['image_recette']['size'])<101200)
Nhay
Messages postés
838
Date d'inscription
vendredi 2 novembre 2012
Statut
Membre
Dernière intervention
17 décembre 2015
126
5 nov. 2012 à 19:54
5 nov. 2012 à 19:54
Je suis pas bien réveiller, j'ai en effet dit n'importe quoi
Cale ne fonctionne pas. Je suis revenue à tmp_name et tout fonctionne.
Mon problème actuel est que ce ne sont pas les bon messages qui apparaissent en fonction des situations. J'ai bien sûr tout chamboulé pour trouvé une solution. Sans résultat.
Quelqu'un à une idée.
Mon problème actuel est que ce ne sont pas les bon messages qui apparaissent en fonction des situations. J'ai bien sûr tout chamboulé pour trouvé une solution. Sans résultat.
Quelqu'un à une idée.
le problème est vraiment quand le fichier est trop gros...Il bloque parfaitement le transfert mais la condition si rattachant qui affiche le message approprié ne s'exécute pas. Il prend le else suivant..
J'ai même supprimé un else qui me semblais inutile et rien ne change...
;(
J'ai même supprimé un else qui me semblais inutile et rien ne change...
;(
Nhay
Messages postés
838
Date d'inscription
vendredi 2 novembre 2012
Statut
Membre
Dernière intervention
17 décembre 2015
126
5 nov. 2012 à 19:57
5 nov. 2012 à 19:57
Dans ton code, je ne vois pas d'erreur dans la structure conditionnelle en tout cas, les if/else sont bien 'raccordé', as-tu essayer un petit echo sur filesize($_FILES['image_recette']['tmp_name']) histoire de voir ce qu'il te retourne ?
Bonne idée, je l'ai fait et j'obtiens tout simplement la taille du fichier. Et dès que le fichier ( jpg) est trop gros il affiche tout le temps le message au sujet des extension d'image.
Si les if / else sont bien raccordé ( et je te crois ) je ne voie pas comment une image trop grosse peut afficher le mauvais message.
Si les if / else sont bien raccordé ( et je te crois ) je ne voie pas comment une image trop grosse peut afficher le mauvais message.