Upload de fichiers et images
$_FILES, validation MIME, déplacement et affichage des images
Concepts Théoriques
Les utilisateurs doivent pouvoir ajouter une image de couverture à leurs articles. L'upload de fichiers en PHP se fait via la superglobale $_FILES et un formulaire avec l'attribut enctype="multipart/form-data".
Le formulaire d'upload
Un formulaire d'upload DOIT avoir :
- method="POST" — obligatoire pour les fichiers
- enctype="multipart/form-data" — indique au navigateur d'envoyer le fichier en binaire au lieu de texte
- <input type="file" name="image"> — le champ de sélection de fichier
La superglobale $_FILES
Quand un fichier est uploadé, PHP le place dans un dossier temporaire et remplit $_FILES :
- $_FILES['image']['name'] — nom original du fichier ("photo.jpg")
- $_FILES['image']['type'] — type MIME ("image/jpeg")
- $_FILES['image']['tmp_name'] — chemin du fichier temporaire
- $_FILES['image']['size'] — taille en octets
- $_FILES['image']['error'] — code d'erreur (0 = succès)
Validation obligatoire
JAMAIS confiance aux données utilisateur — surtout les fichiers. Validez :
- L'erreur — $_FILES['image']['error'] === UPLOAD_ERR_OK
- La taille — en dessous d'un maximum (ex: 2 Mo = 2 * 1024 * 1024 octets)
- Le type MIME — vérifiez avec finfo_file() (plus sûr que $_FILES['type'] qui peut être falsifié)
- L'extension — seulement les extensions autorisées (.jpg, .jpeg, .png, .webp)
Déplacer le fichier
Le fichier temporaire est supprimé à la fin de la requête. Vous devez le déplacer vers un dossier permanent avec move_uploaded_file(). Renommez le fichier avec un nom unique (timestamp ou UUID) pour éviter les collisions et les problèmes de sécurité.
> Sécurité : Ne gardez JAMAIS le nom original du fichier. Un attaquant pourrait uploader un fichier "malicious.php" et l'exécuter. Renommez avec un ID unique et gardez seulement les extensions d'images.