Загрузить файл из S3 — Laravel 5.7

#php #laravel

#php #laravel

Вопрос:

Я пытаюсь загрузить файлы с Amazon s3, и приведенный здесь код работает для таких файлов, как docx, pdf и т.д… Но для изображений он просто открывает новую вкладку и показывает изображение там, загрузка не началась.

 function downloadLink($docpath)
{
    $s3 = Storage::disk('s3');

    return $s3->url($docpath);
}
  

Я заменил метод URL на download, но это вообще не работает, написано, что ошибка 404, страница не найдена.

С наилучшими пожеланиями

Ответ №1:

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

 Content-Type: application/octet-stream
Content-Disposition: attachement; filename="example.png"
  

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

1. Вы правы. Затем вы должны доставить файл с помощью octet-stream, тогда загрузка файла должна сработать. Или когда это загрузка для кого-то, создайте ZIP-файл.

2. Это единственный способ сделать это? я должен признаться, что я не знаком с js или ajax, я ничего не могу сделать в методе, который я могу сделать, чтобы принудительно загрузить ^ изображения? Потому что другие файлы работают нормально

3. Речь не о javascript, ознакомьтесь с PHP-функцией ‘header()’ или прочитайте о HTTP-ответах в Laravel здесь: laravel.com/docs/5.8/responses#attaching-headers-to-responses

4. вернуть ответ ($ s3-> url ($docpath))-> заголовок (‘Content-Type’, ‘application/ octet-stream’)-> заголовок(‘Content-Disposition’, ‘attachement; filename=»example.png»‘); Что-то вроде этого из того, что я прочитал в документах laravel.. однако это не работает

5. Я думаю, что на самом деле ваш исходный фрагмент кода перенаправлял пользователя на URL S3. Если это так, попробуйте добавить заголовки в консоль управления S3. (В этом случае заголовки соответствующего ответа взяты из S3, а не из вашего проекта Laravel.)