Page 17 : Ajout d’un Article - Focus sur l’Upload d’Images
L’envoi d’un fichier sur un serveur est une opération critique. Voici comment nous découpons cette logique pour la rendre sûre et efficace.
Étape 1 : Détection du fichier
On vérifie d’abord si un fichier a été envoyé et s’il n’y a pas d’erreur de transmission.
if (!empty($_FILES['image']['name']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) {
$file = $_FILES['image'];
// ...
}
- Analyse :
UPLOAD_ERR_OK(valeur 0) signifie que le fichier est bien arrivé dans le dossier temporaire du serveur.
Étape 2 : Sécurisation (Format et Taille)
On ne laisse passer que ce que l’on veut.
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$error = match(true) {
!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp']) => "Format d'image non supporté.",
$file['size'] > 2097152 => "Fichier trop lourd (limite : 2 Mo).",
default => null
};
- Analyse : Le
match(true)est une structure moderne de PHP 8 qui permet de tester plusieurs conditions de manière très lisible.
Étape 3 : Création du dossier et Nommage unique
Pour éviter les conflits de noms, on renomme le fichier systématiquement.
if (!$error) {
$path = 'storage/articles/';
if (!is_dir($path)) mkdir($path, 0755, true); // Crée le dossier s'il n'existe pas
$filename = uniqid('article_') . '.' . $ext; // Ex: article_65af12.png
- Analyse :
uniqid()génère un identifiant basé sur l’heure actuelle en microsecondes. Il est quasi impossible d’avoir deux fois le même nom.
Étape 4 : Le transfert définitif
On déplace le fichier du dossier temporaire vers notre dossier de stockage.
if (move_uploaded_file($file['tmp_name'], $path . $filename)) {
$imagePath = $path . $filename; // On mémorise le chemin pour la BDD
} else {
$error = "Erreur lors du déplacement du fichier sur le serveur.";
}
}
- Analyse : Si cette étape réussit, la variable
$imagePathcontiendra le chemin relatif (ex:storage/articles/article_123.jpg) que nous insérerons dans la colonneimagede notre table SQL.
Pourquoi ne pas stocker l’image dans la BDD ?
Un junior pourrait être tenté de stocker l’image directement dans une colonne BLOB de la base de données. C’est une erreur classique.
- Cela fait gonfler la taille de la BDD inutilement.
- Cela ralentit les sauvegardes et les requêtes.
- Le serveur web (Apache/Nginx) est bien plus rapide pour servir des fichiers directement sur le disque que PHP pour extraire une image d’une base de données.
Règle d’or senior : Stockez le fichier sur le disque, stockez son chemin en base de données.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur Page 17 : Ajout d'un Article - Focus sur l'Upload d'Images. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.