Chapter 7. Fonctionnalités Récurrentes

Table of Contents

Upload
Formulaire HTML
Traitement PHP

Certains besoins fonctionnels reviennent en permanence. Par exemple, charger un fichier vers le serveur (upload) est un besoin qui revient dans d'innombrables situations.

Upload

La figure ci-dessous montre un exemple de page HTML permettant de charger un fichier photo vers le serveur (upload).

Figure 7.1. Exemple de file upload form

Exemple de file upload form


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é.

Formulaire HTML

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.

Traitement PHP

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.";
}
?>