PHP - Téléchargement de fichiers

Un script PHP peut être utilisé avec un formulaire HTML pour permettre aux utilisateurs de télécharger des fichiers sur le serveur. Au départ, les fichiers sont téléchargés dans un répertoire temporaire, puis déplacés vers une destination cible par un script PHP.

Informations dans le phpinfo.php décrit le répertoire temporaire utilisé pour les téléchargements de fichiers comme upload_tmp_dir et la taille maximale autorisée des fichiers qui peuvent être téléchargés est indiquée comme upload_max_filesize. Ces paramètres sont définis dans le fichier de configuration PHPphp.ini

Le processus de téléchargement d'un fichier suit ces étapes -

  • L'utilisateur ouvre la page contenant un formulaire HTML comportant un fichier texte, un bouton Parcourir et un bouton Soumettre.

  • L'utilisateur clique sur le bouton Parcourir et sélectionne un fichier à télécharger à partir du PC local.

  • Le chemin complet vers le fichier sélectionné apparaît dans le texte classé, puis l'utilisateur clique sur le bouton Soumettre.

  • Le fichier sélectionné est envoyé dans le répertoire temporaire du serveur.

  • Le script PHP qui a été spécifié comme gestionnaire de formulaire dans l'attribut action du formulaire vérifie que le fichier est arrivé, puis copie le fichier dans un répertoire prévu.

  • Le script PHP confirme le succès à l'utilisateur.

Comme d'habitude lors de l'écriture de fichiers, il est nécessaire que les emplacements temporaires et finaux disposent d'autorisations permettant l'écriture de fichiers. Si l'un ou l'autre est configuré en lecture seule, le processus échouera.

Un fichier téléchargé peut être un fichier texte ou un fichier image ou tout autre document.

Créer un formulaire de téléchargement

Le code HTM suivant ci-dessous crée un formulaire de téléchargement. Ce formulaire a l'attribut de méthode défini surpost et l'attribut enctype est défini sur multipart/form-data

<?php
   if(isset($_FILES['image'])){
      $errors= array();
      $file_name = $_FILES['image']['name'];
      $file_size =$_FILES['image']['size'];
      $file_tmp =$_FILES['image']['tmp_name'];
      $file_type=$_FILES['image']['type'];
      $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
      
      $extensions= array("jpeg","jpg","png");
      
      if(in_array($file_ext,$extensions)=== false){
         $errors[]="extension not allowed, please choose a JPEG or PNG file.";
      }
      
      if($file_size > 2097152){
         $errors[]='File size must be excately 2 MB';
      }
      
      if(empty($errors)==true){
         move_uploaded_file($file_tmp,"images/".$file_name);
         echo "Success";
      }else{
         print_r($errors);
      }
   }
?>
<html>
   <body>
      
      <form action="" method="POST" enctype="multipart/form-data">
         <input type="file" name="image" />
         <input type="submit"/>
      </form>
      
   </body>
</html>

Il produira le résultat suivant -

Créer un script de téléchargement

Il existe une variable PHP globale appelée $_FILES. Cette variable est un tableau associé à double dimension et conserve toutes les informations relatives au fichier téléchargé. Donc, si la valeur attribuée à l'attribut de nom de l'entrée dans le formulaire de téléchargement étaitfile, alors PHP créerait les cinq variables suivantes -

  • $_FILES['file']['tmp_name'] - le fichier téléchargé dans le répertoire temporaire du serveur Web.

  • $_FILES['file']['name'] - le nom réel du fichier téléchargé.

  • $_FILES['file']['size'] - la taille en octets du fichier téléchargé.

  • $_FILES['file']['type'] - le type MIME du fichier téléchargé.

  • $_FILES['file']['error'] - le code d'erreur associé à ce téléchargement de fichier.

Exemple

L'exemple ci-dessous devrait permettre de télécharger des images et renvoyer le résultat sous forme d'informations sur le fichier téléchargé.

<?php
   if(isset($_FILES['image'])){
      $errors= array();
      $file_name = $_FILES['image']['name'];
      $file_size = $_FILES['image']['size'];
      $file_tmp = $_FILES['image']['tmp_name'];
      $file_type = $_FILES['image']['type'];
      $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
      
      $extensions= array("jpeg","jpg","png");
      
      if(in_array($file_ext,$extensions)=== false){
         $errors[]="extension not allowed, please choose a JPEG or PNG file.";
      }
      
      if($file_size > 2097152) {
         $errors[]='File size must be excately 2 MB';
      }
      
      if(empty($errors)==true) {
         move_uploaded_file($file_tmp,"images/".$file_name);
         echo "Success";
      }else{
         print_r($errors);
      }
   }
?>
<html>
   <body>
      
      <form action = "" method = "POST" enctype = "multipart/form-data">
         <input type = "file" name = "image" />
         <input type = "submit"/>
			
         <ul>
            <li>Sent file: <?php echo $_FILES['image']['name'];  ?>
            <li>File size: <?php echo $_FILES['image']['size'];  ?>
            <li>File type: <?php echo $_FILES['image']['type'] ?>
         </ul>
			
      </form>
      
   </body>
</html>

Il produira le résultat suivant -