[PHP] Envoyez des fichiers sur votre serveur

Introduction

Vous avez surement déjà voulu envoyer des fichier sur votre serveur sans passer par le FTP. Ou bien vous avez sûrement déjà vu sur des sites comme Facebook, Twitter, des forums ou même Skyblog/Skyrock Blog vous proposer d’envoyer une image stockée sur votre ordinateur pour votre photo de profil. Sachez que ça n’est pas compliqué à réaliser. Voici comment faire.

Démarrage

Pour cette exemple, nous aurons 2 pages. D’un coté nous aurons une page formulaire.html qui permet à l’utilisateur de sélectionner le fichier. Et de l’autre, une page envoi.php qui permet d’envoyer le fichier sélectionné précédemment.

1ère page: formulaire.php

Dans cette page, il n’y pas grand chose à mettre si ce n’est juste ce code HTML:

<form method="post" action="envoi.php"  enctype="multipart/form-data">
<input type="file" name="fichier" id="fichier" />
<input type="submit" value="Envoyer le fichier" />
</form>

2ème page: envoi.php

Pour cette page, ce sera un peu plus complexe. D’habitude pour récupérer les champs de formulaire, on utilise $_GET ou $_POST selon la méthode choisie. Cette fois, nous allons utiliser $_FILES pour les fichiers.

Explications de $_FILES[]

$_FILES peut être manipulé comme un tableau contenant des cellules étant des fichiers. Chaque cellule du tableau peut être également considéré comme un tableau qui contient d’autres cellules.

$_FILES['fichier']['name'] // Nom d'origine du fichier
$_FILES['fichier']['tmp_name'] // Nom temporaire du fichier dans le dossier temporaire du système
$_FILES['fichier']['type'] // Type MIME du fichier (ex: png, jpg...)
$_FILES['fichier']['size'] // Taille du fichier (en octets)
$_FILES['fichier']['error'] // Code de l'erreur s'il y en a une

Envoyer le fichier sur le serveur

Avant cela, créez un dossier sur votre FTP qui recevra les fichiers. Dans l’exemple, ce dossier s’appelle upload est placé à la racine.
Ensuite, il faut que vous changiez le CHMOD de ce dossier, c’est à dire la portée d’accès au dossier. (Qui peut ? Qui peut pas ?).
Pour cela, dans votre logiciel de transfert FTP (ex: Filezilla), cliquez sur votre dossier, et cherchez « Attributs du fichier » ou « Options CHMOD ». Entrez la valeur 755.

Revenons à notre page envoi.php. Voici le code pour pouvoir transférer le fichier.

// On vérifie si un fichier est indiqué
if(isset($_FILES['fichier']))
{
     $dossier = 'upload/'; // Définition du dossier de réception
     $fichier = basename($_FILES['fichier']['name']); // Séparer le dossier et le fichier

     /* Si la fonction renvoi true, l'envoi a bien été effectué
      * Attention, si un fichier existe déjà, il sera écrasé
      */
     if(move_uploaded_file($_FILES['fichier']['tmp_name'], $dossier . $fichier))
     {
           echo "Envoi effectué avec succès !";
     }
     else
     {
           echo "Echec de l'envoi!";
     }
}

Sécuriser le nom du fichier

Le script ci-dessus fonctionne certes mais il n’est pas du tout sécurisé ! Imaginons que l’utilisateur envoi un fichier avec des accents ou des caractères spéciaux. Il faut donc effectuer une vérification sur le nom du fichier.

// Éliminer les accents
$fichier = strtr($fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');

// REGEX: Expression régulière qui remplace tout ce qui n'est pas une lettre ou un chiffre par un tiret "-" et qui place le résultat dans $fichier
$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);

N’autoriser que l’envoi des images:

Imaginons que vous souhaitez que l’utilisateur ne puisse qu’envoyer des images et non pas des musiques ou autres ? Voici le code pour vérifier l’extension du faire.

// On fait un tableau avec les extensions autorisées
$extensions_autorisees = array('.png', '.gif', '.jpg', '.jpeg');

// Connaître l'extension du fichier envoyé
$extension_fichier = strrchr($_FILES['fichier']['name'], '.');

// Si l'extension n'est pas dans le tableau, on affiche une erreur
if(in_array($extension_fichier, $extensions_autorisees) == false)
{
     echo "Vous devez uploader un fichier de type png, gif, jpg ou jpeg.";
}

Limiter la taille du fichier:

Imaginons cette fois que l’utilisateur veut envoyer une photo de 20Mo ! Ca fait enorme mais on peut définir une limite avec le code ci-dessous.

$taille_maxi = 100000; // Taille maximum (en octets)
$taille = filesize($_FILES['fichier']['tmp_name']); // Taille du fichier

if($taille > $taille_maxi)
{
     echo "Le fichier est trop gros.";
}

Code final de la page envoi.php:

if(isset($_FILES['fichier']))
{
     // Définition du dossier de réception
     $dossier = 'upload/';

     // Séparer le dossier et le fichier
     $fichier = basename($_FILES['fichier']['name']);

     // On fait un tableau avec les extensions autorisées
     $extensions_autorisees = array('.png', '.gif', '.jpg', '.jpeg');

     // Connaître l'extension du fichier envoyé
     $extension_fichier = strrchr($_FILES['fichier']['name'], '.');

     // Taille maximum (en octets)
     $taille_maxi = 100000;

     // Taille du fichier
     $taille = filesize($_FILES['fichier']['tmp_name']);

     // Si l'extension n'est pas dans le tableau, on affiche une erreur
     if(in_array($extension_fichier, $extensions_autorisees) == false)
     {
          echo "Vous devez uploader un fichier de type png, gif, jpg ou jpeg.";
     }
     elseif($taille > $taille_maxi)
     {
          echo "Le fichier est trop gros.";
     }
     else
     {
          // Éliminer les accents
          $fichier = strtr($fichier,
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');

          // REGEX: Expression régulière qui remplace tout ce qui n'est pas une lettre ou un chiffre par un tiret  "-" et qui place le résultat dans $fichier
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);

         /* Si la fonction renvoi true, l'envoi a bien été effectué
          * Attention, si un fichier existe déjà, il sera écrasé
          */
          if(move_uploaded_file($_FILES['fichier']['tmp_name'], $dossier . $fichier))
          {
               echo "Envoi effectué avec succès !";
          }
          else
          {
               echo "Echec de l'envoi!";
          }
     }
}

Lien Permanent pour cet article : https://www.jbvigneron.fr/parlons-dev/php-envoyez-des-fichiers-sur-votre-serveur-avec-php/

1 Commentaire

  1. Je garde ça sous la dent ça pourrait bien me servir! Thx guy!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Verified by MonsterInsights