8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis en train d'écrire un formulaire d'upload de fichier. Ce formulaire pointe vers une frame qui elle-même pointe vers un fichier PHP qui fait teste (par exemple) le type de fichier envoyé, et renvoie une erreur si ce dernier n'est pas bon.

Mon formulaire doit permettre l'upload d'images, donc je n'accepte pas les images au delà de 4Mo, le problème que je rencontre est qu'au moment de faire le test sur la taille du fichier, ce dernier a déjà été téléchargé.
Donc pour résumer, si un utilisateur s'amuse à envoyer une vidéo de 4Go, ai-je un moyen de catcher que le fichier est trop gros avant l'upload ? Sinon, y a-t-il un moyen de rendre l'affichage d'erreur (actuellement des alert balancé en echo dans le fichier .php) soit plus agréable ?

Merci pour vos futures réponses Smiley smile
Modifié par Aerandir (16 Dec 2009 - 14:56)
Salut,

Aerandir a écrit :
ai-je un moyen de catcher que le fichier est trop gros avant l'upload ?
Pas à ma connaissance car il faudrait le faire côté client et donc avec un langage client (typiquement JavaScript). Or pour des raisons de sécurité JavaScript ne peut pas (par défaut) accéder au système de fichiers d'un ordinateur. Il faut donc uploader d'abord le fichier sur le serveur et vérifier le poids en PHP (à noter que l'upload va se vautrer bien avant d'atteindre 4Go en fonction de la valeur de max_execution_time, upload_max_filesize, etc.).

Aerandir a écrit :
Sinon, y a-t-il un moyen de rendre l'affichage d'erreur (actuellement des alert balancé en echo dans le fichier .php) soit plus agréable ?
Déjà je ne comprends pas bien l'intérêt d'utiliser une frame. Pour ce qui est de l'esthétique de l'affichage des erreurs... ben CSS est fait pour ça non ? Ou alors j'ai mal compris la question...
Modifié par Heyoan (16 Dec 2009 - 15:33)
J'utilise un iframe afin du pouvoir submiter mon formulaire et afficher les images envoyées et ce, sans rafraichir la page (sans ajax non plus). Le problème est que pour des gros fichiers (genre un bon gros film), on dirait que le MAX_FILE_SIZE (balise qui limite la taille du fichier uploadable) me coupe l'envoie et donc le submit, donc l'appelle à ma frame, donc tout monde système... Ce qui m'empêche d'afficher un joulie message au méchant internaute qui a envoyé une vidéo alors qu'on lui a dit d'envoyer des images.

Une idée ?
Modifié par Aerandir (16 Dec 2009 - 15:35)
Aerandir a écrit :
J'utilise un iframe afin du pouvoir submiter mon formulaire et afficher les images envoyées et ce, sans rafraichir la page (sans ajax non plus).
En résumé tu gagnes donc 50ms...

Aerandir a écrit :
Le problème est que pour des gros fichiers (genre un bon gros film), on dirait que le MAX_FILE_SIZE (balise qui limite la taille du fichier uploadable) me coupe l'envoie et donc le submit,
Le MAX_FILE_SIZE se contente de générer une erreur en PHP ($_FILES[ error]). On en revient au fait que toutes les erreurs d'upload sont à traiter côté PHP.

En gros je te suggère d'abandonner ton IFRAME et d'afficher tes joulis messages d'erreurs après le traitement de $_FILES[ error]. Smiley smile
Tu peux déjà faire un filtre en testant l'extension du fichier avec javascript
var reg = new RegExp("^.+\.(mpeg|avi|flv|mov|mpa|vob)$","i");
if(!reg.test(uploadField.value)){
   alert('Pas de video svp!');
   return false;
}

Modifié par matmat (16 Dec 2009 - 15:54)
En fait mon <iframe> fait appelle à un fichier php. Donc lorsque l'utilisateur remplit le champ de l'image, le formulaire est validé et est envoyé sur ma page .php (donc mes traitements sont bien côté serveur !).

Maintenant pour suivre ta pensée, j'ai un petit formulaire en local, vers un simple fichier PHP. J'ai mis une limite à 4194304 octets soit 4Mo.
Lorsque j'envoie un fichier texte pas de problème, je récupère sur le fichier PHP les variables utiles dans $_FILES, mais lorsque je balance un film dépassant la limit en taille, mon fichier PHP n'est pas appelé. L'erreur de taille n'est donc pas envoyée dans $_FILES, mais ailleurs peut-être ?
Désolé, si ce que je dis vous paraît stupide, mais je n'arrive pas à suivre le cheminement.

@ matmat : Oui c'est un idée, mais malheureusement ce serait une rustine, et je déteste ça >_<. Enfin s'il n'y a que ça je l'appliquerais avec plaisir. Merci pour ton code Smiley smile
Modifié par Aerandir (16 Dec 2009 - 16:04)
Je viens de regarder sur le site d'annonce d'Ebay que si je renommais ma vidéo en .jpg (parce qu'ils ont un filtre javascript sur l'extension), et bien il mouline, et essaie de me télécharger un fichier énormissime.

Donc dois-je en conclure, qu'on ne peut rien faire ?
Le MAX_FILE_SIZE va effectivement générer une erreur $_FILES[ error] = 2. Par contre il y a d'autres paramètres du php.ini (tel que post_max_size) qui vont faire en sorte que le fichier ne sera même pas uploadé et donc que $_POST et $_FILES seront vides : il faut alors utiliser l'astuce de la variable en $_GET.
Modifié par Heyoan (16 Dec 2009 - 16:28)
Aerandir a écrit :
La variable en GET ? Un lien ou une explication ? (j'en ai jamais entendu parlé)
Euh... ben le lien est celui que je viens de donner.

En résumé :
<form method="post" enctype="multipart/form-data" action="upload.php?processed=1">
Et il suffit de vérifier l'existence de $_GET['processed'] : si elle existe et que $_FILE est vide c'est que la taille du fichier uploadé était délirante.
Modifié par Heyoan (16 Dec 2009 - 16:56)
Bonjour,
d'expérience, le seul moyen de vérifier la taille du fichier avant l'envoi c'est de passer par Flash. Bon je sais, c'est du flash mais c'est comme ça que le système d'upload de pièces jointes fonctionne sur GMail, et j'ai déjà eu l'occasion d'installer un système similaire que j'ai pompé ici : http://digitarald.de/project/fancyupload/
Ca marche du tonnerre, ça permet de passer outre certaines règles de sécurité du JS sans pour autant mettre en péril cette sécurité.

En plus ça te permettra de squizzer ton système d'iframe.
Bonjour,

Merci pour vos réponses.

@skywalk3r : Je ne connaissais pas cette méthode, et j'avoue qu'elle me plaît, malheureusement ce script utilise mootools, alors que mon site (enfin le site de ma boîte tourne sous prototype >_<).
Merci en tout cas, je me garde ce lien sous la main Smiley cligne
Hello,

Le seul moyen de vérifier la taille du fichier avant l'upload que je connaisse est aussi de passer par flash. Regarde du coté de SWFUpload (que j'utilise) qui te mets à disposition sa petite API pour gérer les uploads (multiples, callback au cours de l'upload, lors d'erreur, validation à l'upload sur la taille ou l'extension).

Y a un wrapper jQuery qui existe, peut-être la même chose est dispo pour prototype.