2009-10-03 3 views
2

У меня есть куча видеороликов, хранящихся на моем хранилище Amazon S3. Я работаю над созданием PHP-скрипта, очень похожего на один here, где пользователи могут загружать видео на свой жесткий диск.PHP Force Загрузить удаленный файл

Я хотел бы использовать что-то вроде этого:

<?php 
$file_name = $_GET['file']; 
$file_url = 'http://www.myamazons3.com/' . $file_name; 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url); 
exit; 

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

Любые идеи о том, как я могу заставить загружать эти видео, избегая сначала его читать через свой собственный сервер?

Большое спасибо!

+0

Если вы используете php для этого (например, сценарий на стороне сервера), ваш сервер должен передать файл. проверьте api для реализации на стороне клиента (например, javascript). – vdbuilder

ответ

2

Посмотрите на Документы S3 API и обратите внимание на значения заголовков, которые вы можете установить. Amazon отправит их, когда файл будет запрошен: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html (те же параметры могут быть отправлены с POST для обновления существующего объекта)

0
header('Location: ' . $file_url); 
+0

Это способ перенаправления запроса, но все заголовки, которые он выводит до «Местоположение», бессмысленны, поскольку после заголовка местоположения создается новый HTTP-запрос, который не имеет отношения к предыдущему (поскольку HTTP является протоколом без учета состояния). – Marko

+0

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

+0

Итак, в настоящее время, когда я открываю один из MP4 в моем S3 (в любом случае Firefox), он встраивает MP4 и начинает его воспроизводить. Какой контент-тип мне нужно будет назвать, и как мне это сделать? – Dodinas

1

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

К счастью, есть довольно простой способ настроить файлы для принудительной загрузки с S3. Вы просто хотите установить контент-тип и контент-расположение (просто настройка контента будет работать в некоторых браузерах, но оба они должны работать во всех браузерах).

Этот код при условии, что вы используете класс Amazon S3 PHP от неумышленного:

"приложение/октет-поток", "Content-Disposition" => "вложение")); ?>

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

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

0

Я знаю, что это старый поток, но в течение прошлого года команда S3 добавила поддержку request parameters, что позволяет вам переопределять определенные HTTP-заголовки по запросу.

Вы можете, например, загрузить изображение SVG как image/svg+xml, но затем переопределить заголовки при получении application/octet-stream, чтобы загрузить файл.

Используя AWS SDK for PHP, для этого вы можете использовать способ Aws\S3\S3Client::createPresignedUrl().

Смежные вопросы