lawkunchi
lawkunchi

Reputation: 19

Download multiple uploaded files in Laravel

I have a form input which can upload multiple files. So all the files paths are saved in the database as an array of strings . Below is my controller to download the files. I wanted to know how I can go about presenting each file to be downloaded in blade view. So I could download a single file at a time. My controller below. It works only when downloading a single file. I get this error Invalid argument supplied for foreach().

public function download($id) {
        $deal = Deal::findorFail($id);
        $files = $deal->uploads;
        foreach ($files as $file) {
            return Storage::download($file);
        }
    }

Upvotes: 0

Views: 3675

Answers (1)

Teoman Tıngır
Teoman Tıngır

Reputation: 2901

public function download($id) {
    $deal = Deal::findorFail($id);
    $files = $deal->uploads;

    foreach ($files as $file) {
        return Storage::download($file);
--------^^^^^^-------------------------
    }
}

when you return first file, it breaks foreach loop. So you have to return all files together. And only way to achieve this, is creating a zip file that contains all files..

For this purpose you may use chumper/zipper package

$zipper = Zipper::make(public_path('/documents/deals.zip'));
foreach ($files as $file) {
    $zipper->add(public_path($file)); // update it by your path
}
$zipper->close();
return response()
    ->download(
        public_path('/temporary_files/' . "deals.zip"),
        "deals.zip", 
        ["Content-Type" => "application/zip"]
    );

update

Add accessor to Deal model to get files as array

Deal Model

php artisan getUploadsAttribute($attribute){
   return explode(",",$attributes);
}

Upvotes: 2

Related Questions