How to Create Multiple Download File in Laravel Project

Risqi Ahmad
4 min readJun 20, 2024

--

Download multiple file

Introduction

Laravel, one of the most popular PHP frameworks, is renowned for its elegant syntax and robust features. One of the many tasks you might need to accomplish in a Laravel project is handling multiple file downloads. Whether you’re creating a document management system or offering bulk file downloads, understanding this process is crucial. In this guide, we’ll walk you through setting up a Laravel project to manage and download multiple files efficiently.

Setting Up the Laravel Project

Before we dive into the specifics, you need to have Laravel installed. If you haven’t set up a Laravel project yet, follow these steps:

Installing Laravel

First, ensure you have Composer installed. Then, create a new Laravel project:

composer create-project --prefer-dist laravel/laravel multiple-file-download

Setting Up the Environment

Navigate to your project directory and set up your .env file:

cd multiple-file-download
cp .env.example .env
php artisan key:generate

Configure your database settings in the .env file.

Creating the Database and Model

Database Migration for File Storage

Next, create a migration for the files table:

php artisan make:migration create_files_table

In the migration file, define the schema:

Schema::create('files', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('path');
$table->timestamps();
});

Run the migration:

php artisan migrate

Creating the File Model

Generate the File model:

php artisan make:model File

Configuring the Storage

Setting Up File Storage in Laravel

Laravel provides a convenient way to handle file storage. Ensure you have the proper storage directories set up by running:

php artisan storage:link

Configuring the Filesystem

Configure your filesystem in config/filesystems.php if needed. By default, Laravel uses the local driver, which is suitable for our needs.

Uploading Files

Creating the Upload Form

Create a form for file uploads in a Blade view (resources/views/upload.blade.php):

<form action="/upload" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="files[]" multiple>
<button type="submit">Upload</button>
</form>

Handling File Uploads in the Controller

Create a controller to handle the file uploads:

php artisan make:controller FileController

In the controller, add the upload handling method:

public function upload(Request $request)
{
foreach ($request->file('files') as $file) {
$path = $file->store('uploads');
File::create([
'name' => $file->getClientOriginalName(),
'path' => $path,
]);
}
return back();
}

Storing Uploaded Files

The above code stores the uploaded files in the uploads directory and saves their information in the database.

Retrieving Files from Storage

Fetching Files from the Database

Retrieve files in the controller:

public function index()
{
$files = File::all();
return view('files.index', compact('files'));
}

Displaying Files for Download

In the resources/views/files/index.blade.php view, display the files:

@foreach ($files as $file)
<a href="/download/{{ $file->id }}">{{ $file->name }}</a><br>
@endforeach

Creating the Download Functionality

Writing the Controller Method for Downloading Files

In the FileController, add the download method:

public function download($id)
{
$file = File::find($id);
return response()->download(storage_path('app/' . $file->path));
}

Using response()->download() Method

This method handles the file download by generating a response that forces the user’s browser to download the file.

Handling Multiple File Downloads

Logic for Selecting Multiple Files

Modify the view to allow selection of multiple files:

<form action="/download-multiple" method="POST">
@csrf
@foreach ($files as $file)
<input type="checkbox" name="files[]" value="{{ $file->id }}">{{ $file->name }}<br>
@endforeach
<button type="submit">Download Selected</button>
</form>

Zipping Files for Download

Generating Zip Archives in Laravel

Creating Zip Archives on the Fly

In the controller, use the package to create a zip archive:

public function downloadMultiple(Request $request)
{
$zip = new ZipArchive;
$zipFileName = "download/" . 'Attachment-' . $request->title . '.zip';

if ($zip->open(public_path($zipFileName), ZipArchive::CREATE) === TRUE) {
foreach ($files as $key => $value) {
$filePath = storage_path($value->path);

$filesToZip[] = $filePath;
}

foreach ($filesToZip as $file) {
$zip->addFile($file, basename($file));
}

$zip->close();

return response()->download(public_path($zipFileName))->deleteFileAfterSend(true);

}

Providing Download Links

Displaying Download Links in the View

Ensure the view has a form to select multiple files and a button to download them as a zip.

Handling User Interactions

When the user selects files and clicks the download button, the selected files are zipped and downloaded.

Testing the Download Functionality

Running Tests on File Downloads

Write tests to ensure the download functionality works as expected. You can use Laravel’s testing tools to simulate file uploads and downloads.

Ensuring Files are Correctly Downloaded

Verify that the downloaded files are correct and the zip archive is valid.

Conclusion

Creating a system for multiple file downloads in a Laravel project involves several steps, from setting up the environment to handling file storage and downloads. By following this guide, you can efficiently manage and download multiple files, ensuring a smooth user experience. Laravel’s robust features and community packages make it a versatile choice for such tasks.

--

--

Risqi Ahmad

I love to share about Web Development and Data Science