Chapitre 11Projet SunuLearn

Gestion des fichiers et images

Upload, storage et affichage d'images

Concepts Théoriques

Chaque formation de SunuLearn a besoin d'une image de couverture. Laravel offre une abstraction simple pour uploader, stocker et servir des fichiers via la façade Storage.

Upload basique

public function store(Request $request)
{
    $request->validate([
        'image' => 'required|image|mimes:jpg,png,webp|max:2048', // Max 2 Mo
    ]);

    $path = $request->file('image')->store('formations', 'public');
    // Stocke dans storage/app/public/formations/
    // Retourne : "formations/abc123.jpg"
}

Le fichier est stocké dans storage/app/public/. Pour le rendre accessible depuis le navigateur, il faut un lien symbolique :

php artisan storage:link
# Crée : public/storage → storage/app/public

Ensuite dans Blade : <img src="{{ asset('storage/' . $formation->image_path) }}">.

Nommer le fichier proprement

$file = $request->file('image');
$filename = Str::slug($request->title) . '.' . $file->extension();
$path = $file->storeAs('formations', $filename, 'public');
// formations/laravel-12.jpg

Supprimer l'ancien fichier

Quand on met à jour l'image, il faut supprimer l'ancienne :

use Illuminate\Support\Facades\Storage;

if ($formation->image_path) {
    Storage::disk('public')->delete($formation->image_path);
}

Formulaire avec enctype

<form action="..." method="POST" enctype="multipart/form-data">
    @csrf
    <input type="file" name="image" accept="image/*">
</form>

Le enctype="multipart/form-data" est obligatoire pour les uploads.