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).
| Variable | Description |
|---|---|
$_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 PHP | Valeur | Description |
|---|---|---|
UPLOAD_ERR_OK | 0 | Pas d’erreur. Le fichier est correctement téléchargé. |
UPLOAD_ERR_INI_SIZE | 1 | Taille du fichier supérieure à la valeur de upload_max_filesize. |
UPLOAD_ERR_FORM_SIZE | 2 | Taille du fichier supérieure à la valeur de MAX_FILE_SIZE spécifiée dans le formulaire HTML. |
UPLOAD_ERR_PARTIAL | 3 | Fichier téléchargement partiellement. |
UPLOAD_ERR_NO_FILE | 4 | Aucun fichier téléchargé. |
UPLOAD_ERR_NO_TMP_DIR | 6 | Dossier temporaire manquant. |
UPLOAD_ERR_CANT_WRITE | 7 | Impossible d’écrire le fichier sur le disque. |
UPLOAD_ERR_EXTENSION | 8 | Une 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.