is_uploaded_file()
La fonction is_uploaded_file() vérifie si un fichier a été envoyé via HTTP POST. Retourne true si le fichier provient d'un upload en cours.
La fonction is_uploaded_file() vérifie si un fichier donné a été envoyé via une requête HTTP POST. C'est l'un des outils de sécurité fondamentaux de PHP pour les téléversements de fichiers : elle permet de confirmer qu'un chemin pointe réellement vers un fichier temporaire créé par PHP lui-même à partir de la requête en cours — et non vers un chemin arbitraire qu'un attaquant aurait pu insérer dans votre script.
Ce chapitre couvre la syntaxe, un exemple fonctionnel, le problème de sécurité que résout cette fonction, ainsi que les pièges courants à éviter.
Syntaxe
is_uploaded_file(string $filename): bool$filename— le chemin à vérifier. En pratique, il s'agit toujours d'une valeur issue de$_FILES['...']['tmp_name'].- Valeur de retour —
truesi$filenameest un fichier téléversé lors de la requête en cours,falsesinon.
La fonction retourne true uniquement pour le nom de fichier temporaire assigné par PHP durant le téléversement. Passer un chemin que vous avez construit vous-même (par exemple la destination finale après déplacement du fichier) retourne false.
Exemple de base
<?php
$file = $_FILES['file']['tmp_name'];
if (is_uploaded_file($file)) {
echo 'The file was uploaded via HTTP POST.';
} else {
echo 'The file was NOT uploaded via HTTP POST.';
}Ici, $_FILES['file'] est l'entrée créée lorsqu'un champ de formulaire nommé file est soumis avec enctype="multipart/form-data". La clé tmp_name contient le chemin temporaire côté serveur, et is_uploaded_file() vérifie qu'il provient bien de la requête.
Pourquoi cette fonction existe (sécurité)
Sans cette vérification, un attaquant pourrait soumettre un champ de formulaire ordinaire (pas un fichier) dont la valeur serait un chemin serveur tel que /etc/passwd. Si votre code faisait confiance aveuglément à cette chaîne pour lire ou copier le fichier, vous exposeriez des fichiers système. is_uploaded_file() protège contre cela en retournant true uniquement pour les fichiers reçus par PHP en tant que téléversements dans la requête en cours.
Un gestionnaire de téléversement sécurisé valide le fichier avant toute opération :
<?php
if (
isset($_FILES['file']) &&
$_FILES['file']['error'] === UPLOAD_ERR_OK &&
is_uploaded_file($_FILES['file']['tmp_name'])
) {
$destination = __DIR__ . '/uploads/' . basename($_FILES['file']['name']);
if (move_uploaded_file($_FILES['file']['tmp_name'], $destination)) {
echo 'File stored safely.';
} else {
echo 'Failed to move the uploaded file.';
}
} else {
echo 'No valid upload received.';
}Notez que move_uploaded_file() effectue en interne la même vérification is_uploaded_file(), c'est donc la méthode recommandée pour déplacer un fichier téléversé. Utilisez is_uploaded_file() directement uniquement lorsque vous devez inspecter ou lire le fichier temporaire avant de le déplacer.
is_uploaded_file() vs. move_uploaded_file()
| Fonction | Ce qu'elle fait |
|---|---|
is_uploaded_file() | Retourne un booléen confirmant que le chemin correspond à un téléversement de la requête en cours. Ne touche pas au fichier. |
move_uploaded_file() | Effectue la même vérification, puis déplace le fichier temporaire vers une destination. Échoue (retourne false) si la source n'est pas un vrai téléversement. |
Pièges courants
- Passez toujours
tmp_name, jamais le chemin final. Après avoir déplacé un fichier avecmove_uploaded_file(), le fichier temporaire n'existe plus, donc une nouvelle vérification retournefalse. - La vérification est par requête. Un chemin qui était un téléversement lors d'une requête précédente n'est pas valide pour la requête en cours.
- Elle ne valide pas le contenu.
is_uploaded_file()ne dit rien sur le type ou la taille du fichier. Validez séparément$_FILES['file']['size'], le type MIME et l'extension avant de faire confiance aux données utilisateur. - Vérifiez d'abord le code d'erreur. Inspectez
$_FILES['file']['error'] === UPLOAD_ERR_OKavant d'appeleris_uploaded_file(); un téléversement échoué peut laissertmp_namevide.
Fonctions associées
move_uploaded_file()— déplacer en toute sécurité un fichier téléversé vers sa destination.$_FILESet autres superglobales — comment les données de fichiers téléversés sont exposées à votre script.- PHP File Upload — le formulaire HTML complet ainsi que le gestionnaire PHP pour recevoir des fichiers.
Résumé
is_uploaded_file() retourne true uniquement pour le fichier temporaire créé par PHP à partir d'un téléversement HTTP POST dans la requête en cours. Combinée au code d'erreur de téléversement et à la validation du contenu, elle constitue le fondement d'une gestion sécurisée des fichiers en PHP. Dans la plupart des cas, vous laissez move_uploaded_file() effectuer la vérification à votre place, et vous utilisez is_uploaded_file() directement uniquement lorsque vous devez lire le fichier temporaire avant de le déplacer.