Upload de fichiers en PHP

par

dans

Configuration

Il faut s’assurer d’avoir configurer une valeur suffisamment grande dans l’option memory_limit si le script doit traiter des fichiers volumineux. Il est recommandé de n’augmenter cette option que pour les script qui en ont besoin. L’option post_max_size doit également être ajustée si des fichiers volumineux doivent pouvoir être envoyés.

Si le fichier est volumineux et nécessite un temps de traitement plus long que la normale, il faut s’assurer que la valeur de l’option max_execution_time soit suffisamment grande. L’option max_input_time, qui définit le temps maximum d’un script pour qu’il reçoive les données d’un formulaire (téléchargement du fichier compris), pourra également être augmentée.

L’option max_file_uploads définie le nombre maximum de fichier pouvant être envoyés dans une seule et même requête. Au-delà de cette limite, les fichiers ne seront pas traités et il n’y aura pas d’erreur.

Upload depuis un formulaire HTML

Le formulaire HTML

Au niveau du formulaire HTML, il suffit d’ajouter à la balise du formulaire l’attribut enctype avec une valeur bien précise qui permettra d’indiquer au navigateur qu’il doit envoyer les données sous forme binaires.

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

La variable globale $_FILES

La variable superglobale $_FILES contient les informations du (des) fichier(s) téléchargé(s).

VariableDescription
$_FILES['justificatif']['name']Nom d’origine du fichier, tel qu’il est sur la machine du client.
$_FILES['justificatif']['type']Le type MIME du fichier (exemple : image/jpeg).
$_FILES['justificatif']['size']La taille du fichier, exprimée en octets.
$_FILES['justificatif']['tmp_name']Le nom du fichier temporaire chargé sur le serveur.
$_FILES['justificatif']['errors']Le code erreur du téléchargement du fichier.

Il est donc possible valider ou de refuser un fichier selon sa taille. Si l’on attend un document justificatif comme une facture par exemple, on pourra refuser tout fichier dont la taille est supérieure à quelques méga-octets.

Il est également possible de valider ou de refuser un fichier selon son type. On peut décider de tester le type MIME et/ou l’extension du fichier.

Enfin, il faut vérifier les éventuelles erreurs et afficher un message cohérent à l’utilisateur lorsqu’il y a une erreur. S’il n’y a pas d’erreur, l’entrée errors de la variable $_FILES retournera 0.

Les erreurs possibles

Constante PHPValeurDescription
UPLOAD_ERR_OK0Pas d’erreur. Le fichier est correctement téléchargé.
UPLOAD_ERR_INI_SIZE1Taille du fichier supérieure à la valeur de upload_max_filesize.
UPLOAD_ERR_FORM_SIZE2Taille du fichier supérieure à la valeur de MAX_FILE_SIZE spécifiée dans le formulaire HTML.
UPLOAD_ERR_PARTIAL3Fichier téléchargement partiellement.
UPLOAD_ERR_NO_FILE4Aucun fichier téléchargé.
UPLOAD_ERR_NO_TMP_DIR6Dossier temporaire manquant.
UPLOAD_ERR_CANT_WRITE7Impossible d’écrire le fichier sur le disque.
UPLOAD_ERR_EXTENSION8Une extension PHP a stoppé l’envoi du fichier.

Fonctionnement

Le fichier est téléchargé et stocké temporairement dans le dossier temporaire du serveur, ou dans le dossier temporaire de l’application web si celle-ci le spécifie via la directive upload_tmp_dir.

Le fichier peut être manipulé via les fonctions natives de PHP :

  • Déplacé via la fonction move_uploaded_file().
  • Supprimé via la fonction unlink.
  • etc.

S’il n’est pas déjà déplacé, supprimé ou renommé par l’application, le fichier temporaire sera automatiquement effacé du dossier temporaire à la fin de l’exécution du script.

Progression de l’upload

Il est possible d’afficher un état d’avancement de l’upload de fichiers grâce à la session. Plus d’informations sur la mise en place : https://www.php.net/manual/fr/session.upload-progress.php.