2017-02-17 2 views
1

Я пытаюсь объединить кучу 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: Определенно получает в ответ и действительно создает файл, он просто не кажется, чтобы загрузить для пользователя, ниже, что возвращается в инспекторе так явно что-то не работает, как ожидалось

enter image description here

может быть стоит упоминать код, который посылается к контроллеру

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

Вы уверены, что получаете доступ к функции 'response() -> download()'? – Samsquanch

+0

Да, конечно, там – JonnyFoley

ответ

1

Предполагая, что вы получаете в ту часть методы контроллера, я считаю, что проблема в том, что вы не возвращаете ваш ответ:

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']; 
} 

EDIT: Проблема в том, что вы пытаетесь загрузить файл с помощью 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 
+0

Я изменил его для вашего кода, но тот же результат, я обновил свой вопрос с дополнительной информацией, спасибо за ответ – JonnyFoley

+1

Хорошей новостью является то, что контроллер работает правильно на основе вашего редактирования. Плохая новость заключается в том, что вы не можете скачать такой файл через AJAX. Я обновил свой ответ. – Samsquanch

+0

Spot on - кажется настолько очевидным сейчас, спасибо большое! – JonnyFoley

Смежные вопросы