Envoyer des fichiers sur le serveur

  1. Introduction
  2. Le formulaire
  3. Le code PHP qui traitera nos données

1. Introduction

Le but de ce cours est de voir comment envoyer (uploader) un fichier sur un serveur à partir d’un formulaire : c’est-à-dire sélectionner le fichier sur le disque dur par exemple, puis cliquer envoyer pour envoyer le fichier sur le serveur. Vous voyez ce que je veux dire ?
Dans ce cas nous devons d’abord créer le formulaire d’envoie de fichiers, puis récupérer le fichier grâce au PHP. Il faut noter que le fichier et ses informations sont accessibles via la variable superglobale $_FILES[]. Il faut aussi noter que l’emplacement (répertoire) que doit contenir les fichiers, doit être en mode écriture. Dans ce cas il faut au moins l’attribuer les droits chmod 777.

2. Le formulaire

Comme vous voyez, le fichier qui sera chargé de traiter nos données est sendfiles.php. Ici l’attribut enctype="multipart/form-data" est obligatoire, si vous l’omettez, vous n’arriverez pas à envoyer le fichier.

3. Le code PHP qui traitera nos données

Comme on vous l’a dit dans l’introduction, le fichier et les informations le concernant sont accessibles via la variable superglobale $_FILES[]. Alors nous n’auront pas autant des taches à faire car PHP nous facilite la tache.

Ce qu’il faut retenir :

  • Le nom du fichier aura comme variable $_FILES['fichier']['name']
  • Le chemin du fichier temporaire aura comme variable $_FILES['fichier']['tmp_name']
  • La taille du fichier aura comme variable $_FILES['fichier']['size']
  • La fonction move_uploaded_file sera chargée de déplacer le fichier dans le répertoire temporaire vers le répertoire de destination.

Voici le code PHP permettant d’envoyer le fichier :

Eh voila ! Maintenant vous voyez bien que cela n’est pas compliqué comme vous l’imaginez. Avec ce bout de code, nous pouvons envoyer n’importe quel type de fichier sur notre serveur.

C’est vrai que cela marche, mais attention, je dois vous dévoiler les dangers. Ce code n’est pas du tout sécurisé car il nous permet d’envoyer n’importe quoi sur le serveur. Imaginez un utilisateur malintentionné, il peut envoyer un script malveillant sur ton site et le foutre la merde. J’espère que vous me comprenez. Il faut donc penser à améliorer ce code et je vais vous donner quelques pistes d’amélioration que ça soit côté sécurité ou autre.

  • D’abord il faut décider quel type de fichier doit être envoyé (fichier images, texte, word…).
    Dans ce cas, il faut créer un tableau déterminant les extensions autorisées et vérifier si le fichier porte une des ces extensions. on peut procéder ainsi:
    $extensions_autorisees = array( '.jpg' , '.jpeg' , '.gif' , '.png', '.text', '.docx','.pdf' );
    après on récupère la partie de la chaine à partir du dernier :
    $extension = strrchr($_FILES['fichier']['name'], '.');
    puis on pose une condition qui dit s’il ne s’agit pas d’un fichier ayant une extension autorisée, afficher un message d’erreur. La condition vous pouvez la faire ainsi :
    if(!in_array($extension, $ extensions_autorisees))
  • Vous pouvez aussi verifier si taille du fichier ne dépasse pas la taille autorisée. Dans ce cas vous déclarez la variable de taille du fichier comme nous l’avons défini ci-haut et posez la condition de cette façon :
    if ($_FILES['fichier']['size'] > $maxsize) mais il ne faut pas oublier de déclarer la variable maxisize ($maxsize =1024).
  • Vous pouvez aussi verifier si l’emplacement est autorisé en mode écriture sinon on affiche un message d’erreur. Vous pouvez procéder ainsi :
    if(!is_writeable('./fichiers/'))
  • Vous pouvez aussi verifier si l’emplacement existe, s’il n’existe pas, il faut alors le créer. Pour créer le dossier avec les droits, vous procéderez ainsi :
    mkdir('fichiers/1/', 0777, true);

Bref vous pouvez avoir autant d’idées pour améliorer ce code. Si vous avez un souci, sachez que c’est le but du forum.




Une question? Cliquez ici pour la poser.

Retour sur le portail du PHP