PHP - Problème upload fichier > 8Mo

Résolu/Fermé
bobox87 Messages postés 32 Date d'inscription lundi 6 septembre 2010 Statut Membre Dernière intervention 25 juillet 2011 - Modifié par bobox87 le 10/09/2010 à 22:00
 nando - 5 mars 2013 à 22:46
Bonjour,

J'ai encore une question à laquelle je n'ai pas la réponse.

J'ai créer un script pour l'upload de photo avec vérification de l'extension, taille... mais dès que le fichier uploadé (peu importe l'extension) fait plus de 8Mo, cela embrouille complètement le script en m'affichant des Undefined index: pour chaque champ du formulaire! Heureusement rien n'est uploadé ou ajouté dans la bdd mais de quoi ça vient ? par contre si le fichier fait moins de 8Mo le script marche normalement et m'affiche bien mon message d'erreur qui dit que le fichier uploadé est trop gros

Par exemple pour tester la taille du fichier je fais:

$maxsize = 1048576; //Poids max de l'image 
if ($_FILES['produit_photo']['size'] > $maxsize){ 
... 
}

et dans le formulaire j'ai un champ
<input type="hidden" name="MAX_FILE_SIZE" value="1048576">

Alors est-ce que le problème vient du $_FILES['produit_photo']['size'] qui n'est pas apte a gérer des fichiers de plus de 8 Mo ?

11 réponses

bobox87 Messages postés 32 Date d'inscription lundi 6 septembre 2010 Statut Membre Dernière intervention 25 juillet 2011 1
10 sept. 2010 à 22:12
En fait dans mon php.ini j'ai une ligne:
post_max_size = 8M

Donc j'imagine que c'est une limitation de PHP? Mais dans ce cas comment ne pas afficher tous les Undefined index: si l'upload est > à 8 Mo ? car c'est pas terrible pour la sécurité ça !
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
10 sept. 2010 à 23:10
Salut !

Je pense que le php.ini n'a rien à voir avec cela.
En PHP, une chaine de caractère ne peut contenir que 8 quelque chose (Ko, Mo, ...); Le fichier est géré par ta page PHP donc ne peut dépasser 8 unités.

De même pour les fonctions de lecture de fichier, etc...
Une solution, dont je ne suis pas sûr, est l'upload par Ajax (PAS envoi par iframe). Je n'ai jamais trouvé de code valide pour cela.

Bonne recherche !
0
bobox87 Messages postés 32 Date d'inscription lundi 6 septembre 2010 Statut Membre Dernière intervention 25 juillet 2011 1
11 sept. 2010 à 11:48
Merci mais comment faire pour ne pas afficher tous ces messages d'erreurs c'est ça que je voudrais éviter !
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
11 sept. 2010 à 12:33
Aah... Ca, c'est plus simple !
D'abord n'oublie pas de signaler que le fihcier est trop gros, après, tu as deux solutions :

- Il n'y a qu'une seule fonction qui peux provoquer une erreur, non ? move_uploaded_file(); Lors de son appel, même autour d'un 'if', remplace move_uploaded_file() par @move_uploaded_file(); Cela reviens strictement au même, mais interdit à la fonction d'émettre des messages d'erreur. Dans le cas où d'autres focntions renvoient des erreurs, rajoute aussi un arobase (@) devant, il n'y aura plus de message d'erreur.

- Si cela ne fonctionne pas, il faut voir error_reporting(). Par exemple, error_reporting(0) empêchera l'affichage d'erreur, mais sur n'importe quelle fonction. Si, par après, tu veux de nouveau les erreurs (après l'upload dans la page), il faut renseigner un autre paramètre. Va voir la documentation PHP sur cette fonction.

Bye ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bobox87 Messages postés 32 Date d'inscription lundi 6 septembre 2010 Statut Membre Dernière intervention 25 juillet 2011 1
11 sept. 2010 à 13:58
Bon j'ai essayé plusieurs trucs mais ça marche pas.

De toute manière un script se coupe tout seul au bout de 30 sec il me semble (je crois que c'est réglable dans le php.ini).

Là je viens d'essayer d'uploader sur un site un fichier de 10Mo, ça mouline pendant 2 min et il ne se passe rien, la page se rafraichit mais ça n'affiche pas d'erreur.

Moi je suis en local donc le transfert est hyper rapide, mais quand il sera en ligne cela prendra du temps d'uploader un fichier supérieur à 8 Mo.

Donc ça devrait être bon quand même ce que j'ai fait ?
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
11 sept. 2010 à 15:00
Pour le fichier de 10 Mo, je pense que tu peux oublier (sauf si par miracle l'upload par Ajax fonctionne).
Puis, je t'ai expliqué comment éviter les erreurs.
Maintenant, pour que ton script puisse durer plus que 30 secondes, en tout début de page, écrit cette ligne :
set_time_limit(0);
Et, pour éviter que les uploaders n'ayent une page blanche pendant un temps fou, utiliser l'envoi par iframe (attention, ce n'est pas la même chose que l'upload par Ajax, contrairement à ce que beaucoup pensent).

Bye ;)
0
bobox87 Messages postés 32 Date d'inscription lundi 6 septembre 2010 Statut Membre Dernière intervention 25 juillet 2011 1
11 sept. 2010 à 19:38
En fait je me rends compte que me suis mal exprimé.

Je ne veux surtout pas que les utilisateurs envoient des fichiers de plus de 8Mo (j'ai placé ma limite à 1 Mo).
Toutes les vérifications dans le script php, notamment $_FILES['produit_photo']['size'], fonctionnent parfaitement lorsque le fichier fait moins de 8Mo.

Dès qu'il fait plus de 8Mo j'ai l'impression que le script fait comme si tous les champ du formulaire étaient vides, il m'affiche toutes les erreurs possibles gérées par mon script php notamment le fait que le fichier est trop gros ou pas avec la bonne extension. Mais il m'affiche aussi des Undefined index avec le nom des champ du formulaire.

J'ai essayé de placer error_reporting(0) ou @move_uploaded_file() (d'ailleurs le move_uploaded_file est lancé s'il n'y a aucune erreur après l'insert into dans la bdd). Malheureusement ça ne marche pas.

Mais à mon avis je n'aurais plus d'erreur une fois en ligne, l'upload prendra trop de temps au delà de 8mo et se coupera tout seul.
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
11 sept. 2010 à 22:35
Hmm... La j'ai un peu moins à dire.
Le script se coupera tout seul si tu n'as pas établi de limite (set_time_limit).
Par contre, si cela ne fonctionne pas en local, ca m'étonnerait vraiment que cela fonctionne en public.

Il faut trouver une fonction qui annule carrément le chargement à ue certaine limite. Je n'en connais pas...

Ce qu'il reste à faire, c'est chercher. J'ai déjà trouvé ce post :
https://forums.commentcamarche.net/forum/affich-7661677-php-upload-max-filesize
Qui cite quelques pistes explorables.

Pour continuer à chercher, j'ai trouvé ce post ici :
https://www.google.be/?gws_rd=ssl#hl=fr&q=php+upload+de+plus+de+8+mo+plante

Ah oui, essaie de ne pas toucher à php.ini, parce que sur un hébergeur tu ne pourras pas le modifier.

Bye ;)
0
bobox87 Messages postés 32 Date d'inscription lundi 6 septembre 2010 Statut Membre Dernière intervention 25 juillet 2011 1
Modifié par bobox87 le 12/09/2010 à 01:10
Oui j'ai essayé avec le le upload_max_size mais nan ça veut pas.

Bref, j'ai pu mettre mon script en ligne sur le site d'un ami, et la ouf j'ai pas tous les undefined index, ça mouline pendant 2 min et il ne se passe rien en retour pas de message d'erreur. Je préfère ça, problème résolu.

Merci pour ton aide ;)
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
12 sept. 2010 à 11:39
Salut !

Normalement avec error_reporting, tu ne devrait avoir aucune erreur. Enfin bon.

De rien ;)
0
salut,
meme soucis, des qu'on envoi un fichier qui dépasse la taille autoriser par le serveur , on dirait que sa n'envoi rien du tout ... comment faire ?
0