Laravel 未在浏览器中下载 Zip 存档

Laravel Zip Archive not downloading in browser

我正在尝试将一堆 PDF 压缩在一起并在浏览器中下载,此时 PDF 文件被压缩并下载到 PDF 存储的文件夹中,而不是通过用户浏览器下载到他们的下载文件夹中,我有一个类似(而且更简单)的功能,它可以下载一个 PDF,所以我觉得我在这里遗漏了一些相当明显的东西..

$id 是一个逗号分隔的文件名列表,然后将其拆分为一个数组,用于循环并添加到 zip 文件中。这一点有效,认为它可能是 header 问题或响应。

非常感谢任何帮助。

public function downloadMultiple($id) {

    $id_array = explode(',', $id);

    $public_dir = storage_path();
    $zipFileName = time().'.zip';

    $zip = new ZipArchive;

    if ($zip->open($public_dir . '/' . $zipFileName, ZipArchive::CREATE) === TRUE) {

        foreach($id_array as $file) {

            $file_path = storage_path($file).".pdf";

            if (file_exists($file_path)) {
                $zip->addFile($file_path,$file.".pdf");
            }
        }

        if ($zip->close()) {
            $filetopath = $public_dir.'/'.$zipFileName;

            $headers = [
                'Cache-control: maxage=1',
                'Pragma: no-cache',
                'Expires: 0',
                'Content-Type : application/octet-stream',
                'Content-Transfer-Encoding: binary',
                'Content-Type: application/force-download',
                'Content-Disposition: attachment; filename='.time().'.zip',
                "Content-length: " . filesize($filetopath)
            ];

            if (file_exists($filetopath)) {
                $response = response()->download($filetopath, $zipFileName, $headers);
                //$response->deleteFileAfterSend(true);
            } else {
                return ['status'=>'zip file does not exist'];
            }

        } else {
            return ['status'=>'zip file could not close'];
        }

    } else {
        return ['status'=>'Could not create new zip'];
    }
}

更新: 绝对到达 return 并确实创建了文件,它似乎没有为用户下载,下面是检查器中带回的内容,很明显有些东西没有按预期工作

可能值得一提的是发送到控制器的代码

let xhr = new XMLHttpRequest(),  self = this;
             xhr.open('GET', window.location.origin+'/download-multiple/' + this.selected);
             xhr.onload = function () {
             };
             xhr.send();

假设您正在执行控制器方法的那一部分,我认为问题在于您没有返回响应:

if (file_exists($filetopath)) {
    // $response = response()->download($filetopath, $zipFileName, $headers);
    // $response->deleteFileAfterSend(true);
    return response()->download($filetopath, $zipFileName, $headers)->deleteFileAfterSend(true);
} else {
    return ['status'=>'zip file does not exist'];
}

编辑:问题是您正试图通过 AJAX 加载文件,您无法按照您尝试的方式 (see here for examples on how to do it) 加载文件。将您的 javascript 更改为:

let xhr = new XMLHttpRequest(),  self = this;
window.location = window.location.origin+'/download-multiple/' + this.selected