Pergunta

Eu tenho arquivos no Amazon S3.Eles são nomeados com um ID exclusivo, portanto não existem duplicatas.Eu sou acessá-los usando um autorizados URL.Eu preciso ser capaz de passar através do navegador, mas eu preciso renomeá-los.Agora eu estou usando fopen, mas é baixar o arquivo para meu servidor antes de servir o arquivo para o navegador.Como posso ter os arquivos 'pass through' meu servidor para o browser?Ou como faço buffer download - download de uma pequena parte do meu servidor e passar isso para o navegador durante o download o próximo bloco?

Também - eu realmente gostaria de usar CloudFront, mas eles não oferecem URLs autenticadas.Eu acredito que eu posso usar o CURL para enviar credenciais para a solicitação - posso fazer esse tipo de 'passar' arquivo de servir com CURL?

Obrigado!

Foi útil?

Solução

Eu não estou familiarizado com a forma como S3 funciona, então eu não sei se esta solução é possível.Mas você não poderia simplesmente redirecionar o navegador do usuário para o arquivo?Se eu entendi corretamente, S3 permite que você para criar URLs de web para qualquer um dos arquivos em seu balde.Assim, se, digamos, estes são pagos downloads, em seguida, você pode temos S3 gerar uma URL temporária para download e, em seguida, remova-o de uma vez que o usuário baixou.

Se não for uma opção, você pode tentar estas Classes de PHP:

  • Protocolo HTTP do cliente - Uma classe que implementa solicitações HTTP recursos (usado pelo abaixo stream wrapper).Permite que solicitações para ser transmitido.
  • gHttp - Uma sequência de HTTP wrapper que permite tratar remoto HTTP recursos como arquivos, usando funções como fopen(), fread(), etc.
  • O Amazon S3 Stream Wrapper - Amazon S3 stream wrapper pelo mesmo desenvolvedor como gHttp.Também permite a recursos remotos para ser acessado como arquivos comuns, através de fopen('s3://...').

Editar:

Nesta página tem as informações como "pre-authenticate" um pedido de codificação a autenticação de chave na URL.É sob a seção intitulada: Seqüência De Caracteres De Consulta De Solicitação De Autenticação Alternativos.

// 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;

Em seguida, basta redirecionar o usuário para $url, e eles devem ser capazes de baixar o arquivo.A assinatura é codificado por um caminho esquema de criptografia sha1 (), de modo que não há risco de o AWS Chave de Acesso Secreta a ser descoberto.

Outras dicas

Você já tentou usar HTTP_GET, com request_options para especificar o httpauth e httpauthtype? Embora eu não me lembro se este método assume um tipo válido string, que pode não funcionar para bem binário.

Se isso for bem sucedido, então você deve ser capaz de fornecer o tipo MIME correto e escrever para o navegador.

Você já tentou bu apenas usando readfile ( " http: // usuário: senha @ host / filename. ext ")?

Isso só vai desvio e escrever diretamente para o OUTPUTBUFFER, no entanto, se o tipo de conteúdo é uma preocupação que você precisa para verificar se em primeiro lugar.

Usando en URL como argumento para ReadFile também requer que o PHP é compilado com urlwrapper-apoio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top