В php я хочу загрузить файл s3 в браузер, не сохраняя его на моем сервере - PullRequest
5 голосов
/ 21 апреля 2009

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

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

Спасибо!

Ответы [ 3 ]

5 голосов
/ 21 апреля 2009

Я не знаком с тем, как работает 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.

1 голос
/ 21 апреля 2009

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

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

0 голосов
/ 22 апреля 2009

Вы пробовали использовать только readfile ("http://username:password@host/filename.ext")?

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

Использование en URL в качестве аргумента для файла чтения также требует, чтобы PHP был скомпилирован с поддержкой urlwrapper.

...