Gérer efficacement les images de profil dans une application Laravel peut être complexe.
Sans une méthodologie claire, vous risquez de rencontrer des problèmes de stockage et de performance.
Cet article vous guide à travers un processus structuré pour redimensionner et sauvegarder des images, assurant une gestion optimale.
Initiez-vous à Laravel et réalisez votre première application en toute confiance.
Dans cette section, nous allons expliquer en détail comment redimensionner et sauvegarder une image de profil dans une application Laravel. Le processus comprend trois étapes principales :
Sauvegarder l'image profil Laravel
Lorsque l’utilisateur télécharge une image, nous devons d’abord vérifier si un fichier a bien été envoyé et s’il est valide. Ensuite, nous générons un nom de fichier unique basé sur l’ID de l’utilisateur et le nom d’utilisateur pour éviter les conflits de noms. Enfin, nous stockons le fichier dans un répertoire dédié (avatars/).
Voici le code pour cette étape :
if (request()->hasFile('avatar') && request()->file('avatar')->isValid()) {
$ext = request()->file('avatar')->extension();
$filename = Str::slug($user->name) . '-' . $user->id . '.' . $ext;
$path = request()->file('avatar')->storeAs('avatars/' . $user->id, $filename);}
- hasFile(‘avatar’) :Vérifie si le champ avatar contient un fichier.
- isValid() :Vérifie si le fichier téléchargé est valide.
- extension() :Récupère l’extension du fichier (JPEG, PNG, etc.).
- Str ::slug($user->name) : Crée un nom de fichier lisible à partir du nom de l’utilisateur.
- storeAs(‘avatars/’ . $user->id, $filename) :Stocke le fichier dans un dossier spécifique à l’utilisateur.
Redimensionner image miniature Laravel
Nous utilisons la bibliothèque Intervention Image pour manipuler l’image. Nous allons créer une miniature de l’image de profil en la redimensionnant à une taille spécifique (200×200 pixels dans cet exemple).
Le code pour redimensionner l’image est le suivant :
$thumbnailImage = Image::make(request()->file('avatar'))
->fit(200, 200, function ($constraint) {
$constraint->upsize();
})
->encode($ext, 50);
- Image ::make(request()->file(‘avatar’)) : Crée une instance de l’image à partir du fichier téléchargé.
- fit(200, 200) :Redimensionne l’image à une taille de 200×200 pixels, en conservant ses proportions.
- $constraint->upsize() :Empêche l’agrandissement de l’image si elle est plus petite que la taille cible.
- encode($ext, 50) :Encode l’image avec le même format (JPEG ou PNG) en réduisant la qualité à 50% pour optimiser la taille du fichier.
Sauvegarder miniature image Laravel
Une fois l’image redimensionnée, nous devons sauvegarder la miniature dans un répertoire séparé. Nous utilisons Storage pour enregistrer l’image sur le disque.
Voici le code pour sauvegarder la miniature :
$thumbnailPath = 'avatars/' . $user->id . '/thumbnail/' . $filename;
Storage::put($thumbnailPath, $thumbnailImage);
- avatars/’ . $user->id . ‘/thumbnail/’ :Crée un dossier pour la miniature de l’utilisateur dans un sous-répertoire thumbnail/.
- Storage ::put($thumbnailPath, $thumbnailImage) : Sauvegarde l’image redimensionnée dans le stockage Laravel.
Code store() avec Intervention Image
Voici le code complet pour la méthode store() dans le UserController
public function store(Request $request)
{
$user = auth()->user();
$request->validate([
'name' => ['required', 'string', 'min:3', 'max:20', Rule::unique('users')->ignore($user->id)],
'email' => ['required', 'string', 'email', Rule::unique('users')->ignore($user->id)],
'avatar' => ['sometimes', 'nullable', 'file', 'image', 'mimes:jpeg,png', 'dimensions:min_width=200,min_height=200'],
]);
if ($request->hasFile('avatar') && $request->file('avatar')->isValid()) {
// Supprimer l'ancien répertoire d'avatars si nécessaire
if (Storage::exists('avatars/' . $user->id)) {
Storage::deleteDirectory('avatars/' . $user->id);
}
// Générer un nom unique pour l'image
$imageName = time() . '-' . $request->file('avatar')->getClientOriginalName();
// Chemin de destination pour l'image principale
$destinationPath = public_path('avatars/' . $user->id . '/');
if (!file_exists($destinationPath)) {
mkdir($destinationPath, 0777, true);
}
// Lire l'image
$image = Image::read($request->file('avatar'));
// Sauvegarder l'image principale
$image->save($destinationPath . $imageName);
// Générer une miniature et la sauvegarder
$destinationPathThumbnail = public_path('avatars/' . $user->id . '/thumbnail/');
if (!file_exists($destinationPathThumbnail)) {
mkdir($destinationPathThumbnail, 0777, true);
}
$image->resize(200, 200, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
$image->save($destinationPathThumbnail . $imageName);
return back()
->with('success', 'Profil et avatar mis à jour avec succès!')
->with('imageName);
}
En résumé
- Sauvegarde de l’image originale :L’image téléchargée est stockée dans un répertoire spécifique à l’utilisateur.
- Redimensionnement pour la miniature :L’image est redimensionnée à une taille de 200×200 pixels.
- Sauvegarde de la miniature :La miniature est sauvegardée dans un sous-dossier thumbnail du dossier avatars/.
Cette approche garantit que vous avez une image de profil de haute qualité pour l’utilisateur et une miniature optimisée pour une utilisation dans les pages où une image plus petite est nécessaire (par exemple, dans les aperçus).
Si en veut tester la validation d’image en va enter une fichier invalide le résultat s’affiche doit être comme suivante
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment sauvegarder une image de profil dans Laravel ?
Comment redimensionner une image avec Intervention Image dans Laravel ?
Comment sauvegarder la miniature d'une image dans un répertoire séparé ?
Quel est le code complet pour gérer le stockage des images dans Laravel ?
Comment gérer les erreurs lors de la manipulation d'images dans Laravel ?
Conclusion
En appliquant ces étapes, vous pourrez efficacement gérer les images de profil dans Laravel. Quels autres aspects du stockage d’images souhaitez-vous explorer ?