Tp 2 php render redirect blogpoo
Thème :
Junior
1 vues ·17/30 leçons

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 $imagePath contiendra le chemin relatif (ex: storage/articles/article_123.jpg) que nous insérerons dans la colonne image de 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.

  1. Cela fait gonfler la taille de la BDD inutilement.
  2. Cela ralentit les sauvegardes et les requêtes.
  3. 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.