В php я хочу загрузить файл s3 в браузер, не сохраняя его на своем сервере.
Вопрос
У меня есть файлы на Amazon S3.Им присвоен уникальный идентификатор, поэтому дубликатов нет.Я получаю к ним доступ, используя авторизованный URL-адрес.Мне нужно иметь возможность передавать их в браузер, но мне нужно их переименовать.Сейчас я использую fopen, но он загружает файл на мой сервер, прежде чем передать его в браузер.Как я могу заставить файлы «проходить» через мой сервер в браузер?Или как мне буферизовать загрузку - загрузить небольшой фрагмент на свой сервер и передать его браузеру при загрузке следующего фрагмента?
Кроме того, мне бы очень хотелось использовать CloudFront, но они не предлагают аутентифицированные URL-адреса.Я считаю, что могу использовать CURL для отправки учетных данных для запроса. Могу ли я сделать такой «сквозной» файл, обслуживающий с помощью CURL?
Спасибо!
Решение
Я не знаком с тем, как работает S3, поэтому не знаю, возможно ли это решение.Но не могли бы вы просто перенаправить браузер пользователя на файл?Если я правильно понимаю, S3 позволяет вам создавать веб-URL-адреса для любого файла в вашей корзине.Итак, если, скажем, это платные загрузки, вы можете попросить S3 сгенерировать временный URL-адрес для этой загрузки а затем удалите его, как только пользователь загрузит его.
Если это не вариант, вы можете попробовать эти классы PHP:
- клиент протокола HTTP — Класс, реализующий запросы к HTTP-ресурсам (используется приведенной ниже оболочкой потока).Позволяет передавать запросы в потоковом режиме.
- гХттп - Оболочка HTTP-потока, которая позволяет обрабатывать удаленные HTTP-ресурсы как файлы, используя такие функции, как
fopen()
,fread()
, и т. д. - Оболочка потока Amazon S3 — Обертка потока Amazon S3 от того же разработчика, что и gHttp.Также позволяет получать доступ к удаленным ресурсам, как к обычным файлам, через
fopen('s3://...')
.
Редактировать:
Эта страница содержит информацию о том, как «предварительно аутентифицировать» запрос путем кодирования ключа аутентификации в URL-адресе.Это в разделе под названием: Альтернатива аутентификации запроса строки запроса.
// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
return "$req\n\n\n$expires\n$uri";
}
function encodeSignature($sig, $key) {
$sig = utf8_encode($sig);
$sig = hash_hmac('sha1', $sig, $key);
$sig = base64_encode($sig);
return urlencode($sig);
}
$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);
$url .= '?AWSAccessKeyId='.$awsKeyId
.'&Expires='.$expires
.'&Signature='.$signature;
Затем просто перенаправьте пользователя на $url
, и они смогут скачать файл.Подпись закодирована с помощью схемы одностороннего шифрования (sha1), поэтому риск раскрытия вашего секретного ключа доступа AWS отсутствует.
Другие советы
Пробовали ли вы использовать http_get с request_options для указания httpauth и httpauthtype?Хотя я не помню, предполагает ли этот метод строковый допустимый тип, который может не работать для двоичных файлов.
Если это удастся, вы сможете указать правильный тип MIME и записать его в браузер.
Вы пробовали, но просто использовали readfile("http://имя пользователя:пароль@хост/имя_файла.ext") ?
Это просто обойдет и запишет непосредственно в выходной буфер, однако, если тип контента вызывает беспокойство, вам необходимо сначала это проверить.
Использование en URL в качестве аргумента для readfile также требует, чтобы PHP был скомпилирован с поддержкой urlwrapper.