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
我正在尝试将一堆 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