Я пытаюсь объединить кучу PDF-файлов вместе и загрузить их в браузере, в то время как файлы PDF зашифровываются и загружаются в папку, в которой хранятся файлы PDF, а не через браузер пользователей и в их папку для загрузки, у меня есть аналогичная (и намного более простая) функция, которая загружает один PDF-файл, поэтому чувствую, что мне не хватает чего-то довольно очевидного здесь.Laravel Zip Архив, не загружаемый в браузере
$ id - это разделенный запятыми список имен файлов, это затем разбивается на массив для циклического перехода и добавления в zip-файл. этот бит работает, думая, что это может быть проблема с заголовком или с ответом.
Любая помощь очень ценится.
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'];
}
}
Update: Определенно получает в ответ и действительно создает файл, он просто не кажется, чтобы загрузить для пользователя, ниже, что возвращается в инспекторе так явно что-то не работает, как ожидалось
может быть стоит упоминать код, который посылается к контроллеру
let xhr = new XMLHttpRequest(), self = this;
xhr.open('GET', window.location.origin+'/download-multiple/' + this.selected);
xhr.onload = function() {
};
xhr.send();
Вы уверены, что получаете доступ к функции 'response() -> download()'? – Samsquanch
Да, конечно, там – JonnyFoley