Table of Contents
Certains besoins fonctionnels reviennent en permanence. Par exemple, charger un fichier vers le serveur (upload) est un besoin qui revient dans d'innombrables situations.
La figure ci-dessous montre un exemple de page HTML permettant de charger un fichier photo vers le serveur (upload).
Comme pour le traitement des données postées par formulaire,
charger un fichier comporte conceptuellement deux étapes:
Un formulaire HTML qui permet de sélectionner le fichier,
Un fichier PHP de traitement qui manipule le fichier transféré.
Le champ permettant de sélectionner un fichier et le bouton 'Choisir' sont produits par le navigateur quand il rencontre la balise HTML <input type="file">. Cette balise, comme tous les autres champs input doit être dans un formulaire (<form>). Un exemple HTML de base pour cette fonctionnalité est donné ci-dessous:
<form enctype="multipart/form-data" action="uploader.php" method="POST"> <input type="hidden" name="max_file_size" value="100000" /> Choisir fichier: <input name="fichier_photo" type="file" /><br/> <input type="submit" value="Soumettre" /> </form>
Ici, en appuyant sur le bouton de type submit "Soumettre", le formulaire
va diriger les données du formulaires vers le fichier de traitement
uploader.php
. La propritété multipart/form-data
permet au fichier de traitement de réagir correctement.
On passe aussi dans un champ caché la taille (en octets) maximale qu'on souhaite
pouvoir transmettre.
Quand la page uploader.php
est exécutée, le fichier chargé est
stocké par le serveur web dans un espace de stockage temporaire. Si il n'est pas
déplacé rapidement, il sera détruit par le serveur web.
Pour localiser ce fichier temporaire et les informations associées, nous allons
consulter une variable renseignée par PHP ( à la façon dont on le faisait quand
il fallait récupérer des données d'un formulaire stockées pour le transport dans
la variable $_POST
).
Pour le transfert de fichier, on utilise la variable $_FILES
.
Cette variable est renseignée par PHP à l'arrivée sur le traitement du fichier.
C'est un vecteur, avec un élément par fichier chargé (le forumlaire
pouvait permettre le chargement de plusieurs fichiers).
Chaque élement est indexé par le nom du champ HTML du formulaire.
Dans notre exemple, les informations sont trouvées par $_FILES['fichier_photo']
.
Chaque élément est lui-même un vecteur de propriétés: le nom, le type, le nom temporaire, l'erreur,
la taille du fichier.
La structure en PHP de $_FILES
pour notre exemple pourrait être:
Array ( [fichier_photo] => Array ( [name] => baby.jpg [type] => image/jpeg [tmp_name] => /tmp/php/php1h5j1o [error] => UPLOAD_ERR_OK (= 0) [size] => 45654 ) )
Et on peut récupérer par exemple le nom de fichier original par $_FILES['fichier_photo']['name']
.
Un code PHP typique utilisera la fonction prédéfinie move_uploaded_file()
pour transférer le fichier temporaire vers un endroit de stockage définitif. Dans l'exemple
suivant, on transfère le fichier temporaire vers un répertoire images/
en renommant au passage le fichier temporaire avec le nom original du fichier.
<?php $donnees = "images/"; $nom_final = $donnees. basename( $_FILES['fichier_photo']['name']); if (move_uploaded_file($_FILES['fichier_photo']['tmp_name'], $nom_final)) { echo "Le fichier a ete charge sur le serveur (taille=" . ['fichier_photo']['size'] . ")"; } else{ echo "Erreur lors du transfert vers le serveur."; } ?>