Форсирование Загрузка с серверов s3 amazon

Я разрабатываю новое веб-приложение, которое использует серверы 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 в ближайшее время, когда пользователь нажимает на ссылку.

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

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

    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, а не с моего сайта?

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

~ Select a file in S3. 
~ Properties > Metadata > Add more metadata
~ Key: Content-Disposition  Value: Attachment
~ Save

Ответ 3

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

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

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

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

Ответ 4

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

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