Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

cverster's avatar

Downloading a Zip file from a Laravel Nova action

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 likes
0 replies

Please or to participate in this conversation.