Envoyer Upload de fichier

Que ce soit pour l’envoi de fichier, la mise en ligne d’un fichier via une interface ou la mise en place d’un upload pour l’affichage d’un avatar ou d’une photo. L’upload ou chargement sur le serveur d’un fichier peut se faire facilement en php.
Cet article prendra comme exemple le chargement d’un avatar. Pour réaliser ce guide, j’ai suivi et lu plusieurs site dont sur Développez.com.

Structure pour uploader un fichier

Dans un premier temps, il faut faire un formulaire :

<form method="POST" action="upload.php" enctype="multipart/form-data">
     <input type="file" name="avatar" />
     <input type="submit" name="envoyer" value="Envoyer le fichier"> 
</form>

La methode et l’action ont déjà été vues dans l’article précédent, il faudra impérativement indiquer le type d’encodage, ici : multipart/form-data. Sans cette information, tout ce qui suit ne fonctionnera pas.
Nous voyons ici un nouveau type de fichier, ici file. Une fois le formulaire validé, la variable $_FILES[‘avatar’] est une variable tableau dont voici les détails :

  • Nom du fichier >>> $_FILES[‘avatar’][‘name’]
  • Emplacement du fichier temporaire >>> $_FILES[‘avatar’][‘tmp_name’]
  • La taille du fichier >>> $_FILES[‘avatar’][‘size’]
  • Le type MIME >>> $_FILES[‘avatar’][‘type’]
  • Un code erreur >>> $_FILES[‘avatar’][‘error’]

Récupérer le fichier

Script php pour récupérer le fichier

Nous allons maintenant récupérer le fichier :

<?php     
if(isset($_FILES['avatar']))// On exécute ce qui suit seulement si il y a un ficher de sélectionner     
{      
      $dossier = 'upload/';//emplacement de destination     
      $fichier = basename($_FILES['avatar']['name']);//le nom du fichier a téléchargé     
      if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...     
      {     
           echo 'Upload effectué avec succès !';     
      }     
     else //Sinon (la fonction renvoie FALSE).     
      {     
           echo 'Echec de l\'upload !';     
      }     
}     
?>

Les causes d’échec de transfert

Problème de chemin

Lors de la mise en place de ce script, il faut s’assurer que le chemin du dossier de destination est le bon, dans le cas où l’information comme quoi l’upload a été fait, mais que le fichier n’est pas présent, utiliser la fonction find (sous linux) ou la recherche sur windows pour voir si le fichier est bien présent, dans la négative, à la place de $dossier.$fichier par seulement $fichier et lancer de nouveau une recherche, vous trouverez donc la racine pour le chemin.

Problème de droit

Il se peut que les droits ne permettent pas le transfert, jeter un coup d’œil sur cet <a href= »https://www.la-programmation.surleweb-france.fr/art/Linux/69/linux-et-les-permissions.html » title= »Les droits et permissions sur Linux » target= »_blank »>article</a>.

Sécuriser le transfert de fichier

Ne mettez pas ce script tel quel en ligne.

Limiter la taille

Pour éviter de surcharger et de planter votre serveur, il est important de limiter le fichier qui peut être surchargé. Dans le formulaire, ajouter :

<form method="POST" action="upload.php" enctype="multipart/form-data">
     
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
     <input type="file" name="avatar" />
     <input type="submit" name="envoyer" value="Envoyer le fichier">
</form>

La valeur max est en octet mais cette valeur peut être modifiée par un utilisateur, nous allons donc le vérifier dans le script php :

<?php
if(isset($_FILES['avatar']))// On exécute ce qui suit seulement si il y a un ficher de sélectionner
{ 
     $taille_maxi=100000;
     if($taille_maxi>=$_FILES['avatar']['size'])
     {
           $dossier = 'upload/';//emplacement de destination
           $fichier = basename($_FILES['avatar']['name']);//le nom du fichier a téléchargé
           if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
           {
                 echo 'Upload effectué avec succès !';
            }
           else //Sinon (la fonction renvoie FALSE).
           {
                echo 'Echec de l\'upload !';
           }
     }
}
?>

Protection sur le type de fichier et le nom

Les régex sont des outils efficaces, pour protéger son script et son serveur, nous allons limiter les caractères pouvant être dans le nom et limiter les extensions des fichiers autorisés, la régex est celle-ci :

#[a-zA-Z0-9_-]+\.(jpeg|jpg|png|gif)#

A adapter selon vos besoins.

<?php
if(isset($_FILES['avatar']))// On exécute ce qui suit seulement si il y a un ficher de sélectionner
{ 
     $taille_maxi=100000;
     if($taille_maxi>=$_FILES['avatar']['size'] and preg_match('#[a-zA-Z0-9_-]+\.(jpeg|jpg|png|gif)#',$_FILES['avatar']['name']))
     {
           $dossier = 'upload/';//emplacement de destination
           $fichier = basename($_FILES['avatar']['name']);//le nom du fichier a téléchargé
           if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
           {
                 echo 'Upload effectué avec succès !';
            }
           else //Sinon (la fonction renvoie FALSE).
           {
                echo 'Echec de l\'upload !';
           }
     }
}
?>

Le dernier code peut être utilisé pour une mise en ligne de votre script.

Laisser un commentaire