Я не знаком с тем, как работает S3, поэтому я не знаю, возможно ли это решение. Но не могли бы вы просто перенаправить браузер пользователя в файл? Если я правильно понимаю, S3 позволяет создавать веб-URL для любого из файлов в вашем ведре. Так, если, скажем, это платные загрузки, вы можете заставить S3 сгенерировать временный URL для этой загрузки , а затем удалить его, как только пользователь загрузит его.
Если это не вариант, вы можете попробовать следующие классы PHP:
- Клиент протокола HTTP - Класс, который реализует запросы к ресурсам HTTP (используется оберткой потока ниже). Позволяет передавать запросы в потоковом режиме.
- gHttp - Оболочка потока HTTP, которая позволяет обрабатывать удаленные ресурсы HTTP как файлы, используя такие функции, как
fopen()
, fread()
и т. Д.
- Amazon S3 Stream Wrapper - Оболочка 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.