2009-04-21 9 views
5

Ho dei file su Amazon S3. Sono nominati con un ID univoco quindi non ci sono duplicati. Sto accedendoli usando un URL autorizzato. Devo essere in grado di passarli attraverso il browser, ma ho bisogno di rinominarli. In questo momento sto usando fopen, ma sta scaricando il file sul mio server prima di servire il file sul browser. Come posso far passare i file attraverso il mio server al browser? O come faccio a tamponare il download - scaricando un piccolo pezzo sul mio server e lo trasmetto al browser mentre scarichi il blocco successivo?In php, voglio scaricare un file s3 nel browser senza memorizzarlo sul mio server

Inoltre - mi piacerebbe davvero utilizzare CloudFront ma non offrono URL autenticati. Credo di poter utilizzare CURL per inviare credenziali per la richiesta: posso eseguire questo tipo di file 'pass through' con CURL?

Grazie!

risposta

5

Io non sono a conoscenza di come funziona S3, quindi non so se questa soluzione è possibile. Ma non potresti semplicemente reindirizzare il browser dell'utente al file? Se ho capito bene, S3 ti consente di creare URL web per tutti i file nel tuo bucket. Quindi, se, ad esempio, si tratta di download a pagamento, è possibile utilizzare have S3 generate a temporary URL for that download e quindi rimuoverlo una volta che l'utente lo ha scaricato.

Se questo non è un'opzione, è possibile provare queste classi PHP:

  • HTTP protocol client - Una classe che implementa le richieste a risorse HTTP (usata dal flusso involucro sotto). Permette alle richieste di essere trasmesse in streaming.
  • gHttp - Un involucro flusso HTTP che permette di trattare le risorse HTTP remote come file, usando le funzioni come fopen(), fread(), ecc
  • Amazon S3 Stream Wrapper - Un flusso di Amazon S3 involucro dallo sviluppatore stesso come gHttp. Consente inoltre di accedere alle risorse remote come file ordinari tramite fopen('s3://...').

Edit:

This page ha informazioni su come "pre-autenticazione" una richiesta codificando la chiave di autenticazione nell'URL. È sotto la sezione intitolata: Alternativa all'autenticazione richiesta stringa di query.

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

Poi basta reindirizzare l'utente a $url, e dovrebbero essere in grado di scaricare il file. La firma è codificata da uno schema di crittografia unidirezionale (sha1), quindi non c'è alcun rischio che la chiave di accesso segreto AWS venga scoperta.

+0

L'unica preoccupazione che avrei con il reindirizzamento è che è necessario verificare che la sicurezza non sia passata. Se il reindirizzamento richiede l'autorizzazione, lo dai al cliente. – Joe

+0

Bene, ecco perché viene generato un URL pubblico temporaneo. In questo modo non vengono trasmesse informazioni di autenticazione e l'URL scompare non appena l'utente ha ricevuto il file (o dopo un certo limite di tempo). – Calvin

+0

Non penso che questo risolva il mio rischio di ridenominazione. Se sposto due file in una cartella pubblica per consentire il download direttamente, dovrei dare loro dei nomi amichevoli lì. È possibile che abbiano lo stesso nome, e poi sono bloccato. – Corey

1

Hai provato a usare http_get, con request_options per specificare il HTTPAuth e httpauthtype? Anche se non ricordo se questo metodo assume un tipo stringa valido, che potrebbe non funzionare per bene binario.

Se questo è successo, allora si dovrebbe essere in grado di fornire il tipo MIME corretto e scrivere al browser.

+0

Grazie, Joe. Lo esaminerò. – Corey

0

Hai provato bu usando solo readfile ("http://username:[email protected]/filename.ext")?

che sarà solo di bypass e scrivere direttamente al outputbuffer, se il contenuto-tipo è fonte di preoccupazione è necessario verificare che prima.

L'utilizzo dell'URL come argomento per il readfile richiede anche che PHP sia compilato con urlwrapper-support.

Problemi correlati