- Array
- (
- [name] => cover2.jpg
- [type] => image/jpeg
- [tmp_name] => c:/wamp/tmp\phpBF5.tmp
- [error] => 0
- [size] => 50142
- )
L’upload d’image est une des fonctions de base d’un site internet moderne, qu’il s’agisse de l’édition du profil avec Avatar, ou de l’ajout d’une photo personnelle sur un réseau social, ou encore l’envoi d’une image sur un site de stockage spécialisé pour forums... etc.
PHP dispose de toutes les fonctions nécessaire au traitement d’un upload, quel qu’il soit, via le multipart/form-data. Mais permettre à un visiteur d’envoyer des fichiers sur votre serveur est un vecteur d’attaque critique. En effet n’importe qui pourrait uploader un fichier malicieux qui, par exemple, effacerait tous les autres fichiers du serveur.
C’est pourquoi l’upload se limite souvent aux images, ou autre type de fichier défini. Nous allons voir dans ce tutoriel comment vérifier qu’un utilisateur upload bien une image valide et du type voulu.
La première brique de l’édifice, un formulaire HTML tout à fait classique, si ce n’est le enctype="multipart/form-data" dans la balise <form>. Il ne faut pas l’oublier !
Un formulaire d’upload se compose donc :
Notre image va être contenu dans le tableau $_FILES[’photo’]. Analysons ce que ce tableau contient après un envoi de fichier :
Le code d’erreur renvoyé par PHP va nous permettre d’effectuer une première série de vérifications. Pour voir les correspondances code d’erreur -> intitulé de l’erreur, un petit tour dans la doc PHP suffit.
En cas d’erreur on remplis un Array nommé $erreurs, nous allons ainsi pouvoir afficher plusieurs erreurs gracieusement ![]()
On est maintenant à peu prêt sûr que le fichier à bien été transmis, reste à effectuer les tests de type, d’extension... etc.
Pour cela nous allons définir quelques variables et fonctions dont nous aurons besoin :
La fonction get_extension est plutôt simple, on explose le nom du fichier à tous les points, et on prend le dernier segment.
On défini ensuite un Array contenant toutes les extensions autorisés, un autre avec les constantes getimagesize autorisé (1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF (Ordre des octets Intel), 8 = TIFF (Ordre des octets Motorola), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF) et quelques variable clairement identifiable.
getimagesize() est une fonction PHP très utile pour tester une image, elle renvoie pleins d’informations utile, et FALSE si le fichier n’est pas une image valide :
C’est avec elle qu’on vérifie le type réel de l’image, en plus de tester l’extension :
On vérifie ensuite que le poids de l’image est réellement inférieur à nos directives, et si le fichier est vraiment présent sur le serveur :
PHP teste déjà ça pour nous au début, mais ces tests pourraient s’avérer utiles sur un serveur mal configuré ou mal entretenu.
Tous nos tests sont maintenant terminé, nous sommes maintenant sûr à 99% d’avoir bien une image de type Jpeg.
Notre image se trouve pour le moment dans le tmp/ de PHP, il nous faut la déplacer vers notre répertoire de destination. Pour cela PHP devra avoir les droits d’écriture sur le dossier en question (chmood).
Avant de déplacer notre fichier, nous devons aussi vérifier qu’un fichier du même nom n’existe pas déjà, car autrement PHP l’écraserait sans préavis.
On commence par nettoyer le nom du fichier, afin d’éviter les caractères spéciaux qui ne sont pas très sexy dans une url :
Une fois le nom nettoyé, on fait un while(tant que le fichier existe), en ajoutant une partie aléatoire au nom du fichier. C’est peut être pas la meilleure solution, c’est à adapter en fonction de votre application (si c’est pour un avatar, renommer l’image avec l’identifiant unique du membre par exemple).
Nous pouvons maintenant utiliser la fonction move_uploaded_file() pour déplacer notre fichier du tmp/ au dossier voulu :
Si vous avez tout suivi, vous êtes maintenant capable de produire le script complet (j’ai volontairement évité de vous coller les blocs de test et autre gestion des erreurs... ), si ce n’est pas le cas, le code complet du script d’upload d’image en php est disponible ici. Il est entièrement fonctionnel et prêt à être utilisé pour une application.
Commentaires, réactions : sur le blog ! Merci.
Dernière mise à jour le 21 Novembre 2007.

Tutoriel Upload d'image en PHP est mis à disposition selon les termes de la licence Creative Commons Paternité-Pas d'Utilisation Commerciale 2.0 France par son auteur, Damien ALEXANDRE.
Damien ALEXANDRE, diplômé du DUT SRC (Services et Réseaux de Communications) de l'IUT Michel de Montaigne Bordeaux 3, je suis actuellement développeur PHP et intégrateur XHTML/CSS.
Ici vous pouvez découvrir mes travaux, mes créations et mon curriculum vitae. Pour plus d'informations, vous pouvez également me contacter, et visiter mon blog.