PRATIQUE PHP 
Gérer les envois de fichier en ligne avec PHP
 
Exploitez les fonctionnalités du fameux langage serveur pour traiter efficacement les fichiers transmis par vos utilisateurs, et les informer des possibles erreurs de transfert. (17/01/2007)
  Forum

Réagissez dans les forums de JDN Développeurs

Permettre l'envoi d'un fichier sur un serveur depuis une page Web est extrêmement simple. Il suffit de mettre en place un formulaire avec les bons attributs (en l'occurrence, enctype="multipart/form-data") et balises, et l'application est théoriquement fonctionnelle. Seulement, le fichier est alors envoyé sans que vous sachiez vraiment où il est arrivé - ou même s'il est effectivement arrivé.

Les fichiers envoyés sur un serveur Web sont pris en charge par ce dernier, qui leur attribut un nom unique pour pouvoir les conserver dans leur répertoire temporaire sans risque d'effacer un fichier qui s'y trouverait déjà. Le nom du fichier n'est pas connu, et le fichier pourrait même être inaccessible depuis le Web, selon la configuration du serveur et de son répertoire temporaire.

C'est pourquoi un langage de programmation côté serveur comme PHP est nécessaire : il fournit les outils non seulement pour savoir où le fichier a été stocké, mais également sous quel nom - et au besoin, dire si une erreur s'est produite, et laquelle.

En PHP, tout fichier mis en ligne crée une variable $_FILES, contenant un tableau associatif donnant accès aux informations disponibles : nom original du fichier, nom et chemin attribués par le serveur, taille (en octets), type MIME du fichier, et type d'erreur. Ce dernier champ, en PHP, peut prendre cinq valeurs : aucune erreur (valeur 0), taille limite PHP dépassée (1), taille limite du formulaire (champ caché MAX_FILE_SIZE) dépassée (2), fichier incomplet (3), pas de fichier envoyé (4).

Partant de là, il est rapidement possible de mettre en place une série de tests autour de notre formulaire d'envoi, afin de vérifier si tout se déroule comme prévu, et d'afficher les données nécessaires.
  1. <?php
  2. // La variable $_FILES de notre formulaire est-elle créée ?
  3. if (isset($_FILES['fichier'])) {
  4.     // Y'a-t-il eu une erreur ?
  5.     if ($_FILES['fichier']['error'] == 0) {
  6.         // Afficher les informations
  7.         echo "en ligne!</br>";
  8.         echo "Nom : " . $_FILES['fichier']['name'] . "</br>";
  9.         echo "Nom temporaire : " . $_FILES['fichier']['tmp_name']."</br>";
  10.         echo "Taille : " . $_FILES['fichier']['size'] . "</br>";
  11.         echo "Type : " . $_FILES['fichier']['type'] . "</br>";
  12.  
  13.         // Déplacer le fichier temporaire dans un dossier accessible, sous son nom original
  14.         $temporaire = $_FILES['fichier']['name'];
  15.         $definitif = "/tmp/" . $_FILES['fichier']['name'];
  16.         move_uploaded_file($temporaire, $definitif);
  17.  
  18.         // Informer l'utilisateur
  19.         echo "le fichier a bien été envoyé. Il se trouve à l'adresse ".$definitif;
  20.         }
  21.     // Il y a une erreur...
  22.     else {
  23.         // L'afficher
  24.         echo "Erreur : ".$_FILES['fichier']['error']."</br>";
  25.         }
  26.     }
  27. // $_FILES n'est pas créée, donc aucun fichier n'a été envoyé :
  28. // nous affichons le formulaire d'envoi.
  29. else { ?>
  30. <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
  31.     <input type="file" name="fichier" /><br/>
  32.     <input type="hidden" name="MAX_FILE_SIZE" value="1024000" />
  33.     <input type="submit" value="Transfert !" />
  34. </form>
  35. <?php
  36.     }
  37. ?>
 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page