Принудительная загрузка с серверов s3 amazon - PullRequest
18 голосов
/ 14 мая 2011

Я разрабатываю новое веб-приложение, которое использует серверы Amazon S3 в качестве системы хранения и Codeiginter в качестве среды PHP.

Мне нужно принудительно загрузить файл при нажатии на ссылку. Исходный URL выглядит следующим образом:

http://www.our-web.com/download/do/1.jpg

, который генерирует временный подписанный URL-адрес фактического файла на серверах Amazon S3, например:

http://main_bucket.s3.amazonaws.com/post/1/1.jpg?AWSAccessKeyId=AKIAJEOQKYPKC3CCU5RA&Expires=1305395426&Signature=iuzCdA22gImLK192%2BMAhk8OkAY8%3D

Мне нужно, чтобы файл начал загружаться с реального URL-адреса Amazon, как только пользователь щелкнет ссылку.

У меня есть два способа сделать это:

  1. Используйте redirect(), который откроет файл, а не загрузит его; или
  2. Измените заголовки, как этот код:

    header('Content-type: application/force-download');
    header('Content-Disposition: attachment; filename=' . $file_name);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 4000');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($generated_file));
    
    readfile($generated_file);
    

К сожалению, оба способа мне не помогают. Второй способ вызывает загрузку с моего веб-сайта, а не напрямую с Amazon.

Как заставить файл загружаться напрямую с серверов Amazon S3, а не с моего сайта?

Ответы [ 5 ]

31 голосов
/ 15 мая 2011

Вам просто нужно установить правильные заголовки в ваших файлах в S3, чтобы заставить браузер загружать, а не открывать файл.Установите их:

Content-Disposition: attachment; filename=FILENAME.EXT
Content-Type: application/octet-stream

Вам нужно будет установить их при загрузке файлов на S3.С php SDK вы бы использовали create_object.

Или вы можете установить их после загрузки, используя 'change_content_type' или , копируя файл себе в S3 и устанавливая правильные заголовки.

10 голосов
/ 27 мая 2016

Немного опоздал на вечеринку, но часто с файлом, который вы не хотите решать, при хранении, как он будет использоваться. Вы хотите иметь возможность сохранить файл один раз, затем в одной области возможно встроить файл или отобразить в браузере, а в другой области разрешить пользователю загрузить тот же файл.

К счастью, вы можете сделать это, предоставив параметры переопределения в URL-адресе запроса. Это работает только с подписанными запросами, но, к счастью, вы уже делаете это.

Если вы добавите такой параметр, как &request-content-type="application/force-download", это должно помочь.

Ознакомьтесь с разделом Параметры запроса документации S3 GET Object: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html

9 голосов
/ 25 сентября 2013

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

  • Выберите файл в S3.
  • Свойства> Метаданные> Добавить дополнительные метаданные
  • Ключ: значение содержания-размещения: вложение
  • Сохранить
0 голосов
/ 04 апреля 2019

Если ваш сайт S3 находится за CloudFront, не забудьте аннулировать файл, прежде чем пытаться снова!Это очистит кэшированный файл.

Вы можете перейти на страницу аннулирования, перейдя по ссылке:

Cloudfront -> Distribution Settings -> Invalidation

Затем введите путь к файлу.

Это займетнекоторое время, чтобы сделать файл недействительным.Для моего файла это заняло 5 минут.

0 голосов
/ 14 мая 2011

Вы не можете сказать браузеру, как обрабатывать удаленный файл.Перенаправляя на amazon, вы говорите браузеру начать новый запрос.Вы не можете контролировать этот запрос.

Единственное решение, которое я могу придумать, - это упаковать изображение в zip-файл или аналогичный файл.Конечно, это добавляет еще одну (вероятно, раздражающую) форму сложности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...