PHP Force Загрузить удаленный файл

У меня есть куча видеороликов, хранящихся на моем хранилище 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; 

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

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

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

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

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

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

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

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

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

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

 header('Location: ' . $file_url); 

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

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

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