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

У меня есть файлы на Amazon S3. Они названы с уникальным идентификатором, поэтому нет дубликатов. Я обращаюсь к ним, используя авторизованный URL. Мне нужно иметь возможность передать их в браузер, но мне нужно их переименовать. Прямо сейчас я использую fopen, но он загружает файл на мой сервер, прежде чем передать файл в браузер. Как сделать так, чтобы файлы «проходили» через мой сервер в браузер? Или как мне буферизовать загрузку - загрузить небольшой фрагмент на мой сервер и передать его в браузер при загрузке следующего фрагмента?

Кроме того, я бы очень хотел использовать CloudFront, но они не предлагают аутентифицированные URL-адреса. Я полагаю, что могу использовать CURL для отправки учетных данных для запроса - могу ли я сделать такой «сквозной» файл, обслуживающий с помощью CURL?

Спасибо!


person Corey    schedule 21.04.2009    source источник


Ответы (3)


Я не знаком с тем, как работает S3, поэтому не знаю, возможно ли это решение. Но нельзя ли просто перенаправить браузер пользователя на файл? Если я правильно понимаю, S3 позволяет создавать веб-адреса для любых файлов в вашей корзине. Итак, если, скажем, это платные загрузки, вы можете заставить 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 отсутствует.

person Calvin    schedule 21.04.2009
comment
Единственное беспокойство, которое у меня возникло бы с перенаправлением, заключается в том, что вам нужно убедиться, что ваша безопасность не передается. Если для перенаправления требуется авторизация, вы предоставляете ее клиенту. - person Joe; 21.04.2009
comment
Вот почему создается временный общедоступный URL-адрес. Таким образом, информация об аутентификации не передается, и URL-адрес исчезает после того, как пользователь получил файл (или по истечении определенного срока). - person Calvin; 21.04.2009
comment
Я не думаю, что это решает мой риск переименования. Если я перемещу два файла в общедоступную папку, чтобы разрешить загрузку напрямую, мне придется дать им там понятные имена. Возможно, у них одно и то же имя, и тогда я застрял. - person Corey; 21.04.2009
comment
Так работает S3? Я думал, что веб-адреса генерируются динамически и полностью отделены от файловой системы? Насколько я понимаю, у вас может быть несколько веб-адресов для каждого размещенного файла. - person Calvin; 21.04.2009
comment
@Calvin - Да, вы создаете аутентифицированные URL-адреса для s3. Вы можете иметь столько, сколько вам нужно. Но я думаю, что ваше решение правильное - перенаправить, потому что тогда я могу перенаправить на URL-адрес облачной страницы. МОЙ следующий вопрос: могу ли я перенаправить информацию об аутентификации в заголовках? - person Corey; 22.04.2009
comment
Вроде, как бы, что-то вроде. По сути, вы просто кодируете заголовки в URL. S3 поддерживает этот тип аутентификации для запросов GET. - person Calvin; 22.04.2009
comment
Используя это решение, можно ли принудительно загрузить файл за аутентифицированным URL-адресом? - person murze; 08.11.2011

Вы пытались использовать http_get с request_options для указания httpauth и httpauthtype? Хотя я не помню, предполагает ли этот метод допустимый строковый тип, который может не работать для двоичного кода.

Если это удастся, вы сможете указать правильный тип MIME и записать его в браузер.

person Joe    schedule 21.04.2009
comment
Спасибо, Джо. Я посмотрю на это. - person Corey; 21.04.2009