Domanda

Ho dei file sull'S3 di Amazon.Sono nominati con un ID univoco quindi non ci sono duplicati.Sto accedendo utilizzando un URL autorizzato.Devo poterli passare al browser, ma devo rinominarli.In questo momento sto utilizzando fopen, ma sta scaricando il file sul mio server prima di fornirlo al browser.Come posso fare in modo che i file passino attraverso il mio server al browser?Oppure come posso bufferizzare il download, scaricando un piccolo pezzo sul mio server e passandolo al browser durante il download del pezzo successivo?

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

Grazie!

È stato utile?

Soluzione

Non ho familiarità con il funzionamento di S3, quindi non so se questa soluzione sia possibile.Ma non potresti semplicemente reindirizzare il browser dell'utente al file?Se ho capito bene, S3 ti consente di creare URL web per qualsiasi file nel tuo bucket.Quindi, se, ad esempio, si tratta di download a pagamento, potresti farlo chiedi a S3 di generare un URL temporaneo per quel download e quindi rimuoverlo una volta che l'utente lo ha scaricato.

Se questa non è un'opzione, puoi provare queste classi PHP:

  • Cliente del protocollo HTTP -Una classe che implementa le richieste alle risorse HTTP (utilizzata dal wrapper del flusso riportato di seguito).Consente lo streaming delle richieste.
  • gHttp - Un wrapper di flusso HTTP che ti consente di trattare le risorse HTTP remote come file, utilizzando funzioni come fopen(), fread(), eccetera.
  • Wrapper del flusso Amazon S3 - Un wrapper di flusso Amazon S3 dello stesso sviluppatore di gHttp.Consente inoltre l'accesso alle risorse remote come normali file tramite fopen('s3://...').

Modificare:

Questa pagina contiene le informazioni su come "pre-autenticare" una richiesta codificando la chiave di autenticazione nell'URL.Si trova nella sezione intitolata: Alternativa all'autenticazione della richiesta della 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;

Quindi reindirizza semplicemente l'utente a $url, e dovrebbero essere in grado di scaricare il file.La firma è codificata mediante uno schema di crittografia unidirezionale (sha1), quindi non c'è rischio che la tua chiave di accesso segreta AWS venga scoperta.

Altri suggerimenti

Hai provato a usare http_get, con request_options per specificare il HTTPAuth e httpauthtype? Anche se non mi ricordo se questo metodo presuppone un tipo valido stringa, 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.

Hai provato a bu usando solo readfile ( " http: // nomeutente: password @ host / nome del file. ext ")?

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

Uso en URL come argomento di readfile richiede anche che il PHP è compilato con urlwrapper-supporto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top