Apprendre PHP (18/19) - Chargement (upload) de fichiers sur le serveur

Dans cette leçon vidéo, l’instructeur explique comment gérer l’upload de fichiers avec PHP. Il commence par la création d’un formulaire HTML contenant un champ <input type="file">, en insistant sur l’obligation d’utiliser la méthode POST et l’attribut enctype="multipart/form-data". Il montre ensuite comment récupérer les métadonnées du fichier envoyé via la superglobale $FILES (name, tmpname, type, size) et comment les afficher. Le formateur décrit les limites d’upload imposées par php.ini (taille maximale, répertoire temporaire) et comment les consulter avec phpinfo(). Il détaille la procédure pour sauvegarder définitivement le fichier en utilisant moveuploadedfile, en soulignant la nécessité de gérer les collisions de noms et de choisir un répertoire cible (ex. "uploads"). Il introduit la gestion des retours d’opération (succès / erreur) et les messages d’état. La vidéo aborde les risques de sécurité liés aux uploads (exécution de scripts malveillants) et recommande de valider le type MIME et le contenu avant de stocker le fichier. Enfin, il montre comment ajuster les permissions du fichier stocké avec chmod, en expliquant les valeurs octales (0644, 0600) et leur impact sur le propriétaire, le groupe et les autres utilisateurs. Le cours se conclut par une démonstration pratique de chaque étape et un rappel des bonnes pratiques.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de PHP. Aujourd'hui nous allons voir le chargement de fichiers ou upload. Des fois, au lieu de télécharger des fichiers depuis un serveur, on a plutôt besoin d'en lui envoyer. C'est le cas par exemple de poster une vidéo sur YouTube ou de mettre sa photo de profil sur un réseau social ou encore de joindre une pièce à un email. Donc, afin de charger un fichier sur le serveur, on a besoin d'un input type file comme ceci qui va créer le rendu suivant. Il s'agit d'une zone qui permet d'intégrer un fichier depuis son poste de travail et de l'envoyer vers le serveur web. Cependant, pour que le upload soit fonctionnel, il faut impérativement que la méthode de l'envoi du formulaire soit POST, c'est obligatoire, et en plus il faut expliciter l'attribut enctype comme ceci. EncType est un attribut que l'on déclare souvent si on a besoin d'uploader un fichier vers le serveur. Si on ne le met pas, alors il contient la valeur par défaut qui permet de formater les caractères spéciaux afin de les adapter à l'envoi. Cependant, si on a besoin d'uploader un fichier, alors il est obligatoire d'expliciter l'attribut EncType avec la valeur multipart/form-data. Dans ce cas, on prend en charge l'envoi de fichiers vers le serveur sans que son contenu ne soit compromis. Alors rien qu'avec ce code HTML, l'envoi de fichiers est déjà programmé, c'est-à-dire que si maintenant on inclut un fichier ici et si on clique sur Charger, le fichier sera envoyé vers le serveur. Le problème, c'est qu'il sera mémorisé dans le serveur d'une manière temporaire et du coup une fois la session sera quittée, le fichier sera supprimé aussitôt. Et en plus, on peut pas vraiment connaître des informations à propos du fichier qui vient d'être posté sur le serveur, d'où le rôle du PHP. Donc ce que nous allons faire, c'est tout d'abord afficher les informations du fichier qui vient d'être posté vers le serveur. A donc besoin d'intégrer le code PHP suivant. C'est-à-dire si je clique sur le bouton Valider qui est là, on va faire le traitement qui concerne le upload. Et ensuite on va afficher un message en bas du formulaire comme ceci. La variable message, je vais l'initialiser au début avec une chaîne vide. Maintenant, la première opération à faire, c'est afficher le nom du fichier qui vient d'être envoyé vers le serveur. On mettra donc quelque chose du genre message= nom du fichier, et on va la concaténer avec la variable qui permet de renvoyer le nom du fichier. Dans ce cas, il s'agit de la variable superglobale FILES. Comme ceci. Files est une variable superglobale. Il s'agit en fait d'un tableau à 2 dimensions, c'est-à-dire que l'on va mettre 2 crochets. Le premier crochet contient le nom de l'input, dans ce cas c'est mon fichier. Il s'agit en fait d'un tableau associatif. Et le deuxième crochet contient l'un des mots-clés connus en PHP. Maintenant on va mettre le mot-clé name qui permet de retourner le nom du fichier qui a été posté vers le serveur. Donc exécutons maintenant pour voir le résultat. Donc je vais uploader un fichier, par exemple romarin.jpg, et quand je clique, ça m'affiche le nom du fichier romarin.jpg. En réalité, avec le mot-clé name, on récupère le nom du fichier sur le poste du client, c'est-à-dire le vrai nom sur le client. Dans ce cas, le nom du fichier c'est romarin.jpg. Comme je l'ai dit tout à l'heure, le fichier que je viens de poster maintenant est enregistré sur le serveur d'une manière temporaire. Et pour afficher le nom du fichier provisoire sur le serveur, on va faire ceci: message point égal pour conserver l'ancienne valeur. Je vais mettre copier et là je mettrai nom temporaire du fichier et là c'est tmp name. tmp name c'est un mot clé qui permet de retourner le nom temporaire du fichier sur le serveur. Je vais intégrer ici un \br pour assurer un retour à la ligne. Je vais aussi mettre le texte en gras comme ça. Voilà, comme ceci. Exécutons maintenant pour voir le résultat. Alors le même fichier toujours. Quand je mets charger, ça m'affiche le nom du fichier seromarin.jpg et le nom temporaire c'est ça. En fait, il est déposé dans un dossier par défaut du PHP, mais bien sûr on peut changer ce dossier à travers le fichier php.ini. Maintenant on va afficher le type du fichier. Alors on va mettre copier-coller. Là on mettra type et là c'est le mot-clé type. Exécutons toujours avec les mêmes fichiers et ça nous affiche image/jpeg. En réalité, on appelle ça type et mime. Donc le type, c'est une image, et le mime, c'est en quelque sorte la nature de l'image. Bon, c'est jpeg, gif, etc. Dernière information affichée maintenant, c'est la taille du fichier. Alors toujours copier-coller, on mettra ici taille du fichier. Et là c'est de mon côté, size. Et je peux mettre ici octets juste après. Alors on exécute et ça me donne 180 ko à peu près. Alors là c'est la taille de mon image. Bon maintenant on va changer de fichier, on mettra par exemple un document PDF. Et ça nous affiche les informations suivantes. Bon, on voit bien que le document maintenant ça pèse un peu lourd, donc ça fait 2 Mo. On va tester un autre fichier, c'est un fichier texte dans ce cas. Et on voit bien que le type c'est text/plain avec une toute petite taille. Parlons justement de la taille, il faut savoir que PHP il a des limites. Ça veut dire qu'il ne va pas autoriser toutes les tailles, il faut quand même ne pas dépasser une certaine valeur. Et pour avoir une idée de cette information, on va encore faire appel au fichier php.ini. On va d'abord afficher son chemin. Bon, je mettrai directement ici phpinfo. On exécute. On va prendre ce lien. Bon, je vais l'ouvrir avec le terminal comme ceci. Et on va chercher la ligne file size. Et voilà. Donc en réalité, là c'est une section qui est consacrée à l'upload des fichiers. Alors là, ça dit que le serveur autorise l'upload des fichiers. Et là, c'est pour le dossier temporaire où l'on va mettre les fichiers temporairement uploadés sur le serveur. Ici, c'est la taille maximale à ne pas dépasser. Sur mon serveur, ça mesure 32 Mo, mais on peut bien trouver d'autres valeurs comme 10 Mo, voire même 2 Mo. Et bien sûr, vous êtes libre à modifier cette valeur comme vous souhaitez. Voilà, maintenant on va écarter cette instruction. Alors notre fichier étant temporairement enregistré sur le serveur, il faut quand même l'enregistrer en dur, c'est-à-dire que même si je quitte la session, il faut que mon fichier subsiste sur le serveur. Et pour faire ceci, on va recourir à la fonction moveUploadedFile comme ceci. moveUploadedFile, c'est l'équivalent de la fonction copy qu'on a vu dans la leçon consacrée aux fichiers. Alors il contient 2 paramètres, le source et la destination. La source dans ce cas n'est rien d'autre que le fichier temporaire parce que comme je viens de le dire, le fichier est déjà enregistré sur le serveur mais d'une manière temporaire. Alors je prendrai ça. Et le deuxième argument, vous spécifiez où vous voulez enregistrer ce fichier et avec quel nom. Donc moi j'ai déjà prévu un dossier qui s'appelle uploads comme ça, voilà, qui est vide dans un premier temps. Alors je vais dire que je vais enregistrer mon fichier là-dedans. Je mettrai donc ici uploads comme ceci concaténé avec le vrai nom, c'est-à-dire le nom du fichier sur le client. Alors je mettrai juste ça. Bien sûr, il faut faire attention à ce que le fichier n'existe pas déjà parce que si vous conservez les noms du client, dans ce cas il est possible qu'il y aura une collision et du coup un fichier qui est chargé et qui contient le même nom qu'un fichier déjà existant, alors il va tout simplement l'écraser. Alors il faut faire en sorte de choisir les noms d'une manière unique. Donc maintenant si on fait ça, on est censé enregistrer le fichier dans le dossier qui s'appelle Uploads. Alors exécutons pour voir. On va prendre par exemple romarin.jpg. Quand je mets Charger, il m'affiche les informations. Et maintenant je vais me rendre dans le dossier, je vois bien que le fichier est maintenant enregistré là-dedans. Bon, je vais essayer avec un autre fichier. Vous voyez, les informations sont affichées et le fichier est encore téléchargé sur le serveur. Notez que la fonction move appelée au .find retourne un résultat booléen, c'est-à-dire si la copie est effectuée avec succès, il retourne true, sinon c'est false. On mettra par exemple ici if, ça veut dire si la copie est effectuée avec succès, on mettra message= fichier chargé avec succès. On mettra carrément ici la balise li. Else, on mettra erreur de chargement. Comme par exemple si le fichier est trop gros ou bien on n'a pas les privilèges nécessaires afin de mettre le fichier dans le dossier spécifié sur le serveur. Exécutons maintenant pour voir le résultat. Je vais essayer avec le fichier texte. Donc ça m'affiche fichier chargé avec succès. Et si je me rends dans le dossier, je vois bien que le fichier a été enregistré en dur. Bien sûr, inutile de vous dire qu'il faut vérifier les fichiers avant de les charger sur le serveur pour des raisons évidentes de sécurité. D'ailleurs, il existe une vulnérabilité qui s'appelle la vulnérabilité upload que les pirates exploitent afin de soumettre au serveur des fichiers qui sont nocifs comme des scripts ou ou bien carrément des fichiers malveillants comme des trojans, etc. Alors il faut bien vérifier le type du fichier, voire même son contenu, s'il s'agit d'un fichier texte par exemple, avant de l'enregistrer en dur dans le serveur. Autre chose, c'est que si les fichiers sont uploadés sur le serveur, alors ils ont des droits par défaut qui sont spécifiés par l'administrateur du serveur web. Sinon, on peut changer ces droits à notre guise. Alors je mettrai ici par exemple, si l'enregistrement est effectué avec succès, Avant d'afficher le message, je vais changer les droits du fichier à l'aide de la fonction chmod. Alors ça nous rappelle la commande chmod de Linux. Dans ce cas, ça contient 2 paramètres. Le premier, c'est le fichier sur lequel je vais changer les droits. Dans ce cas, c'est le fichier qui est enregistré en dur. Et le deuxième paramètre, c'est une valeur octale exactement comme on le fait sur les systèmes Linux et qui permet de spécifier les droits de l'utilisateur propriétaire, le groupe et les autres. On mettra par exemple 0644. N'oubliez pas de préfixer votre valeur avec un 0 pour dire que c'est une valeur octale, sinon elle va être prise pour une valeur décimale et ça va fausser le traitement. Donc là, c'est comme si je dis au serveur qu'il faut changer les droits du fichier que je viens de charger de telle sorte à ce que le propriétaire ait le droit de lecture et écriture et les autres utilisateurs ont le droit de lecture seulement. Alors exécutons pour voir maintenant le résultat. Bon, je vais charger le même fichier par exemple. Voilà, maintenant c'est chargé sur le serveur. Je vais maintenant vérifier les droits. Alors je vais encore faire appel à la ligne de commande. Voilà, maintenant on va mettre ls -l pour afficher toutes les informations y compris les droits des fichiers. Alors on voit bien que sur le fichier vhosts on a le droit de lecture-écriture pour le propriétaire, lecture seule pour les utilisateurs du groupe et les autres utilisateurs. Mais ça coïncide bien avec les droits par défaut parce qu'on voit bien que les autres fichiers a, b ou d ont les mêmes droits. Donc on va changer de valeur, on mettra par exemple 600 pour ne donner aucun droit d'interagir avec le fichier par les autres utilisateurs, c'est-à-dire seul le propriétaire du fichier a le droit d'y accéder en lecture et en écriture. Bon, exécutons maintenant. Voilà, avec le même fichier toujours. Donc maintenant on va vérifier les droits et on voit bien que ça a changé, c'est-à-dire seul le propriétaire du fichier a le droit d'y accéder en lecture et en écriture. Les autres par contre, ils n'ont aucun droit sur le fichier. Alors ça sera tout pour cette séance, merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









