Comment télécharger plusieurs images dans une application Laravel .
Nous allons créer une table “images” avec une colonne “name”. Ensuite, nous concevrons une simple page web où les utilisateurs pourront sélectionner plusieurs images à télécharger. Ces images seront enregistrées dans le dossier “images” ainsi que dans la base de données.
Étapes pour le téléchargement multiple d’images avec Laravel 11
Installer Laravel 11
Créer une migration et un modèle
Créer un contrôleur
Créer des routes
Créer un fichier Blade
Étape 1 : Installer Laravel 11
composer create-project laravel/laravel example-app
Étape 2 : Créer une migration et un modèle
php artisan make:migration create_images_table
Créez une migration pour la table “images”. Exécutez la commande suivante pour générer le fichier de migration :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('images', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('images');
}
};
Ensuite, exécutez la migration :
php artisan migrate
Créez un modèle nommé Image pour gérer les données :
php artisan make:model Image
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Image extends Model
{
use HasFactory;
protected $fillable = [
'name'
];
}
Étape 3 : Créer un contrôleur
Créez un contrôleur nommé ImageController pour gérer les vues et la logique de téléchargement des images :
php artisan make:controller ImageController
Ajoutez les méthodes nécessaires pour afficher les vues et stocker les images dans le dossier public et dans la base de données.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Image;
use Illuminate\View\View;
use Illuminate\Http\RedirectResponse;
class ImageController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(): View
{
return view('imageUpload');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function store(Request $request): RedirectResponse
{
// Validate incoming request data
$request->validate([
'images' => 'required|array',
'images.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
// Initialize an array to store image information
$images = [];
// Process each uploaded image
foreach($request->file('images') as $image) {
// Generate a unique name for the image
$imageName = time() . '_' . uniqid() . '.' . $image->getClientOriginalExtension();
// Move the image to the desired location
$image->move(public_path('images'), $imageName);
// Add image information to the array
$images[] = ['name' => $imageName];
}
// Store images in the database using create method
foreach ($images as $imageData) {
Image::create($imageData);
}
return back()->with('success', 'Images uploaded successfully!')
->with('images', $images);
}
}
//Store Images in Storage Folder
$image->storeAs('images', $imageName);
// storage/app/images/file.png
// Store Images in Public Folder
$image->move(public_path('images'), $imageName);
// public/images/file.png
// Store Images in S3
$image->storeAs('images', $imageName, 's3');
Étape 4 : Créer des routes
Ajoutez des routes dans le fichier routes/web.php pour gérer les requêtes GET et POST :
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ImageController;
Route::get('image-upload', [ImageController::class, 'index']);
Route::post('image-upload', [ImageController::class, 'store'])->name('image.store');
Étape 5 : Créer un fichier Blade
<!DOCTYPE html>
<html>
<head>
<title>Laravel 11 Multiple Image Upload Example - ItSolutionStuff.com</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
</head>
<body>
<div class="container">
<div class="card mt-5">
<h3 class="card-header p-3"><i class="fa fa-star"></i> Laravel 11 Multiple Image Upload Example - ItSolutionStuff.com</h3>
<div class="card-body">
@session('success')
<div class="alert alert-success" role="alert">
{{ $value }}
</div>
@foreach(Session::get('images') as $image)
<img src="images/{{ $image['name'] }}" width="300px">
@endforeach
@endsession
<form action="{{ route('image.store') }}" method="POST" enctype="multipart/form-data" class="mt-2">
@csrf
<div class="mb-3">
<label class="form-label" for="inputImage">Select Images:</label>
<input
type="file"
name="images[]"
id="inputImage"
multiple
class="form-control @error('images') is-invalid @enderror">
@error('images')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<div class="mb-3">
<button type="submit" class="btn btn-success"><i class="fa fa-save"></i> Upload</button>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
Créez un fichier nommé imageUpload.blade.php dans le dossier resources/views. Dans ce fichier, concevez un formulaire permettant aux utilisateurs de sélectionner plusieurs images à télécharger.
Lancer l’application Laravel
Toutes les étapes nécessaires étant terminées, lancez l’application Laravel avec la commande suivante :
php artisan serve
Ensuite, ouvrez votre navigateur web, entrez l’URL suivante et visualisez le résultat de l’application :
http://localhost:8000/image-upload