简体   繁体   中英

I am trying to download multiple image as a zip file but getting error using laravel 7

I am trying to download multiple images as a zip file but getting errors Invalid argument supplied for foreach() please help me how i resolve that thanks. 在此处输入图片说明

Check the error: https://flareapp.io/share/47qG2A3m

Controller

public function dowloads($id)
{
    $url = config('yourstitchart.file_url');
    
    $zip = new ZipArchive;
    $inboxFiles = Inbox::where('id', $id)->first()->file;

    // $inboxFiles = "["phpCM0Yia.png","phptLC57a.png"]"

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

You are returning a string, you can't handle it like an array.

It's JSON, you can just use :

$inboxFiles = json_decode(Inbox::where('id', $id)->first()->file);

(the above code is not really robust, but you have the way)

I know this has already been answered, but do not use json_decode any more in Laravel...

Cast the field file as a JSON / array , so it will automatically be an array and when you save it in the database, it will be transformed to JSON, and when you want to read it back, it will be automatically transformed to array...

To do so, you have to edit Inbox model and add this property:

protected $casts = ['file' => 'array'];

And that's it, then you have to use the field as if it is already an array, so leaving your code as it is in your question, without any edit, it will work right away:

public function dowloads($id)
{
    $url = config('yourstitchart.file_url');
    
    $zip = new ZipArchive;
    $inboxFiles = Inbox::where('id', $id)->first()->file;

    // $inboxFiles = "["phpCM0Yia.png","phptLC57a.png"]"

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM