В php я хочу загрузить файл s3 в браузер, не сохраняя его на своем сервере.

StackOverflow https://stackoverflow.com/questions/772505

Вопрос

У меня есть файлы на 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top