Как сказать браузеру, чтобы начать загрузку файла?

#javascript #laravel #laravel-5

#javascript #laravel #laravel-5

Вопрос:

На стороне клиента я делаю POST-запрос в Laravel, чтобы вернуть файл в браузер:

 $headers = [
             'Content-Type' => 'application/vnd.ms-excel',
             'Content-Disposition' => "attachment; filename='Report.xls'"
        ];

        return response()->download(storage_path('app/'.$path.$filename), $filename, $headers);
  

В ответ он возвращает мне двоичный файл:

введите описание изображения здесь

Заголовки ответа являются:

введите описание изображения здесь

Комментарии:

1. я думаю, вам нужно будет использовать return response()->file() вместо response()->download()

2. Я попробовал, это дает мне тот же результат

3. может быть, вам нужно передать заголовок Content-Size?

4. Я пробовал, никакого результата, он всегда возвращает мне двоичный файл в ответ

Ответ №1:

Попробуйте использовать:

 return Storage::download('file.jpg', $name, $headers);
  

Ссылка:https://laravel.com/docs/5.8/filesystem#downloading-files

РЕДАКТИРОВАТЬ 1:

Возможное решение:

Создайте маршрут для получения документа xls (с помощью метода GET http) по его имени, например, кто возвращает:

 return Storage::download('file.jpg', $name, $headers);
  

Выполните POST-запрос, верните 204 http-код с Location заголовком.

 return response()->header('Location', $url)
  

Когда вызывается событие успеха AJAX, выполните:

 success: function(data, textStatus, request) {
    window.open(request.getResponseHeader('Location'), '_blank');
}
  

Комментарии:

1. Тот же результат, возможно, проблема в запросе POST?

2. @OPV я думаю (если это вызов ajax), вам будет лучше открыть новую вкладку в вашем браузере

3. Я попытался открыть в новой вкладке полный путь к файлу, без результата

4. И почему вы выполняете POST-запрос?

5. Конечно, он возвращает мне также двоичный контент