Créer un lien symbolique entre public/storage
et storage/app/public
pour que les images soient enregistrées dans le dossier storage/app/public
php artisan storage:link
Cette article explique bien le système de gestion des fichiers
Afin de manipuler les images plus facilement, on utilise la bibliothèque Php Intervention http://image.intervention.io/
composer require intervention/image
Voir la documentation pour l'installation dans Laravel
Vérifier si cette ligne est décommentée
extension=gd2
Configurer le bon dossier pour enregistrer les images
... 'default' => env('FILESYSTEM_DRIVER', 'local'), ... 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
Au niveau du formulaire, il faut ajouter dans la balise form
le type d'encodage (enctype=“multipart/form-data”
) afin que le formulaire puisse envoyer le fichier au serveur.
<form action="{{ url("posts") }}" method="POST" enctype="multipart/form-data"> ... <input type="file" id="image" name="image" required> ...
Exemple d'un contrôleur ImageController.php
avec une table de base de données qui a une colonne name
pour enregistrer le nom de l'image
use App\Image; use Intervention\Image\Facades\Image as InterventionImage; use Illuminate\Support\Facades\Storage; ... public function store(Request $request) { $request->validate ([ 'image' => 'required|image|max:2000', 'name' => 'nullable|string|max:255', ]); // Enregistre l'image originale dans le dossier '/storage/app/public/images' $path = basename ($request->image->store('images', 'public')); // Enregistre l'image réduite dans le dossier '/storage/app/public/thumbs' $image = InterventionImage::make($request->image)->widen(500)->encode(); Storage::put('public/thumbs/' . $path, $image); // Sauvegarde dans la base de données $image = new Image; $image->name = $path; $request->images()->save($image); return back()->with('ok', __("L'image a bien été enregistrée")); }
widen(500)
permet de redimensionner l'image avec une largeur de 500pxVoici d'autres options prises sur la documentation
// Ouvrir un fichier image $img = Image::make('public/foo.jpg'); // Recadrer le meilleur rapport 5:3 (600x360) et redimensionner à 600x360 pixels $img->fit(600, 360); // Recadrer le meilleur rapport 1:1 (200x200) et redimensionner à 200x200 pixels $img->fit(200); // Ajouter une fonction de rappel pour conserver la taille maximale de l'image d'origine $img->fit(800, 600, function ($constraint) { $constraint->upsize(); });