Comment télécharger des fichiers en PHP

Le 30-10-2023 17:35

PHP File Upload

dAvec PHP, il est facile de télécharger des fichiers sur le serveur.

Cependant, la facilité comporte son lot de dangers, alors soyez toujours prudent lorsque vous autorisez le téléchargement de fichiers !


Configurez le fichier "php.ini"

Tout d’abord, assurez-vous que PHP est configuré pour autoriser le téléchargement de fichiers.

Dans votre fichier "php.ini", recherchez la file_uploads directive et définissez-la sur On :

file_uploads = On

Créer le formulaire HTML

Ensuite, créez un formulaire HTML permettant aux utilisateurs de choisir le fichier image qu'ils souhaitent télécharger :

 
 
  <!DOCTYPE html>
  <html>
  <body>
  
  <form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
  </form>
  
  </body>
  </html>

Quelques règles à suivre pour le formulaire HTML ci-dessus :

 

  • Assurez-vous que le formulaire utilise method="post"
  • Le formulaire nécessite également l'attribut suivant : enctype="multipart/form-data". Il spécifie le type de contenu à utiliser lors de la soumission du formulaire

Sans les conditions ci-dessus, le téléchargement du fichier ne fonctionnera pas.

Autres choses à remarquer :

  • L'attribut type="file" de la balise <input> affiche le champ de saisie sous la forme d'un contrôle de sélection de fichier, avec un bouton "Parcourir" à côté du contrôle de saisie.

Le formulaire ci-dessus envoie les données à un fichier appelé "upload.php", que nous créerons ensuite.




Créer le script PHP de téléchargement de fichier

 

Le fichier "upload.php" contient le code pour uploader un fichier :


  <?php
  $target_dir = "uploads/";
  $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
  $uploadOk = 1;
  $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
  // Check if image file is a actual image or fake image
  if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
      echo "File is an image - " . $check["mime"] . ".";
      $uploadOk = 1;
    } else {
      echo "File is not an image.";
      $uploadOk = 0;
    }
  }
  ?>

Script PHP expliqué :

  • $target_dir = "uploads/" - spécifie le répertoire où le fichier va être placé
  • $target_file spécifie le chemin du fichier à télécharger
  • $uploadOk=1 n'est pas encore utilisé (sera utilisé plus tard)
  • $imageFileType contient l'extension du fichier (en minuscules)
  • Ensuite, vérifiez si le fichier image est une image réelle ou une fausse image.

Remarque : Vous devrez créer un nouveau répertoire appelé "uploads" dans le répertoire où réside le fichier "upload.php". Les fichiers téléchargés y seront enregistrés.

Vérifiez si le fichier existe déjà

Nous pouvons maintenant ajouter quelques restrictions.

Tout d'abord, nous vérifierons si le fichier existe déjà dans le dossier "uploads". Si c'est le cas, un message d'erreur s'affiche et $uploadOk est défini sur 0 :


  // Check if file already exists
  if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
  }

Limiter la taille du fichier

Le champ de saisie du fichier dans notre formulaire HTML ci-dessus est nommé "fileToUpload".

Maintenant, nous voulons vérifier la taille du fichier. Si le fichier fait plus de 500 Ko, un message d'erreur s'affiche et $uploadOk est défini sur 0 :


  // Check file size
  if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
  }

Limiter le type de fichier

Le code ci-dessous permet uniquement aux utilisateurs de télécharger des fichiers JPG, JPEG, PNG et GIF. Tous les autres types de fichiers génèrent un message d'erreur avant de définir $uploadOk sur 0 :


  // Allow certain file formats
  if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
  && $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
  }

Terminer le script PHP de téléchargement de fichier

Le fichier complet "upload.php" ressemble désormais à ceci :


<?php
  $target_dir = "uploads/";
  $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
  $uploadOk = 1;
  $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
  
  // Check if image file is a actual image or fake image
  if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
      echo "File is an image - " . $check["mime"] . ".";
      $uploadOk = 1;
    } else {
      echo "File is not an image.";
      $uploadOk = 0;
    }
  }
  
  // Check if file already exists
  if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
  }
  
  // Check file size
  if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
  }
  
  // Allow certain file formats
  if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
  && $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
  }
  
  // Check if $uploadOk is set to 0 by an error
  if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
  // if everything is ok, try to upload file
  } else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
      echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
    } else {
      echo "Sorry, there was an error uploading your file.";
    }
  }
  ?>