Downloading a Zip file from a Laravel Nova action

Viewed 285

I have some files that I store at /storage/app/public/clientA/files/*.pdf. I have models that I can use to access these, and I want users to be able to download multiple files by selecting them in Nova and then using an action. Here is my code for the action:

public function handle(ActionFields $fields, Collection $models)
{
    $files = array();
    foreach ($models as $file) {
        $path = FileHelper::getPathFromUrl($file->url);
        array_push($files, $path);
    }

    $zip_file = 'myfiles.zip';

    $zip = new \ZipArchive();
    if ($zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) === true)
    {
        foreach ($files as $item) {
            $zip->addFile(public_path('storage/' . $item), $item);
        }
        $zip->close();
    }

    return Action::download($zip_file, $zip_file);
}

Also, here is my code for the getPathFromUrl method:

public static function getPathFromUrl ($url)
{
    $path = '';
    $url_path = parse_url($url, PHP_URL_PATH);
    return substr($url_path, strpos($url_path, "/") + 1);
} // returns the format storage/clientA/files/fileName.pdf

My issue at the moment is that its generating an empty zip file. I'm guessing that my paths are wrong when I try and reference the files, but I don't know how to fix it. I've also tried accessing these locations using Storage::get and found that it can't see the files at valid locations (and yes, I have done Storage:link).

Can anyone give me some insight into what I need to change to my addFile to ensure that these pdfs get added to the zip file?

0 Answers
Related