PHP Force Загрузка удаленного файла - PullRequest
2 голосов
/ 03 октября 2009

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

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

<?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;

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

Есть какие-нибудь идеи о том, как я могу заставить загрузку этих видео, избегая при этом сначала читать их через мой собственный сервер?

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

Ответы [ 4 ]

2 голосов
/ 04 октября 2009

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

1 голос
/ 22 декабря 2009

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

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

В этом коде предполагается, что вы используете PHP-класс Amazon S3 из Undesigned:

"application / octet-stream", "Content-Disposition" => "attachment")); ?>

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

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

0 голосов
/ 26 марта 2013

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

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

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

0 голосов
/ 03 октября 2009
header('Location: ' . $file_url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...