Я разрабатываю новое веб-приложение, которое использует серверы Amazon S3 в качестве системы хранения, а Codeiginter – как фреймворк PHP.
Мне нужно заставить файл загружаться при нажатии ссылки. Исходный URL-адрес выглядит следующим образом:
http://img.ruphp.com/php/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, а не с моего сайта?
Вам просто нужно установить правильные заголовки в своих файлах на S3, чтобы заставить браузер загружаться, а не открывать файл. Установите следующие параметры:
Content-Disposition: attachment; filename=FILENAME.EXT Content-Type: application/octet-stream
Вам нужно будет установить их при загрузке файлов на S3. С помощью php SDK вы должны использовать create_object
.
Или вы можете установить их после загрузки с помощью «change_content_type» или путем копирования файла на себя в S3 и установки правильных заголовков.
Вопрос в том, чтобы установить это программно, но сделать это вручную через консоль AWS:
~ Select a file in S3. ~ Properties > Metadata > Add more metadata ~ Key: Content-Disposition Value: Attachment ~ Save
Бит опоздал на вечеринку, но часто с файлом, который вы не хотите решать во время хранения, как он будет использоваться. Вы хотите иметь возможность хранить файл один раз, а затем в одной области, возможно, вставлять файл или отображение в браузере, а в другой области разрешить пользователю загружать тот же файл.
К счастью, вы можете это сделать, предоставив параметры переназначения в URL-адресе запроса. Он работает только с подписанными запросами, но, к счастью, вы уже это делаете.
Если вы добавите параметр типа &request-content-type="application/force-download"
который должен сделать трюк.
Ознакомьтесь с разделом параметров запроса документации S3 GET: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html.
Вы не можете сообщить браузеру, как обращаться с удаленным файлом. Переадресовываясь на amazon, вы говорите браузеру, чтобы начать новый запрос. У вас нет контроля над этим запросом.
Единственное решение, о котором я могу думать, – упаковать изображение в zip-файл или аналогичный. Конечно, это добавляет еще одну (возможно, раздражающую) форму сложности.