2013-09-05 23 views
5

Ho creato un URL $ firmato per Amazon s3 e si apre perfettamente nel browser.Verifica se il file esiste su Amazon s3 URL firmato

http://testbucket.com.s3.amazonaws.com/100-game-play-intro-1.m4v?AWSAccessKeyId=AKIAJUAjhkhkjhMO73BF5Q&Expires=1378465934&Signature=ttmsAUDgJjCXepwEXvl8JdFu%2F60%3D 

** nome Benna e accesskey cambiato in questo esempio

Sto provando comunque utilizzare per la funzione qui sotto per controllare (utilizzando ricciolo) che il file esista. Non riesce la connessione CURL. Se sostituisco $ URL sopra con l'url di un'immagine esterna a s3, allora questo codice funziona perfettamente.

So che esiste il file in Amazzonia, ma non può funzionare perché questo codice non riesce se si utilizza un URL firmato come sopra

Tutte le idee?

Grazie

Ecco il mio codice.

function remoteFileExists($url) { 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    //don't fetch the actual file, only get header to check if file exists 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 

    $result = curl_exec($ch); 
    curl_close($ch); 



    if ($result !== false) { 

     $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

     if ($statusCode == 200) { 
      $ret = true; 
     } else { 
      $ret = false; 
     } 

    } else { 
     $ret='connection failed'; 
    } 

    return $ret; 

} 
+0

Quando uso questo codice per verificare se il file esiste su s3 con l'url firmato poiché è un bucket privato (cioè privo di criteri pubblici), fallisce sempre con 'connection failed' che indica che la connessione CURL non è riuscita. –

+0

Scusa se questo è facilmente risolvibile con l'SDK PHP di AWS, ma sto cercando di farlo funzionare senza l'SDK poiché sto aggiungendo la funzionalità in un plugin per wordpress. Grazie –

risposta

4

Quando si utilizza CURLOPT_NOBODY, libcurl invia una richiesta HTTP HEAD, non una richiesta GET.

... la stringa da firmare è formato aggiungendo il verbo REST, valore del contenuto-MD5, il valore Content-Type, scade il valore del parametro, headers Canonicalized x-AMZ (vedi ricetta sotto), e la risorsa; tutto separato da newline.

http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

il "resto verbo" - per esempio, GET vs HEAD - devono essere coerenti tra la firma si genera, e la richiesta che fanno, in modo da una firma che è valido per GET non sarà valido per HEAD e viceversa.

È necessario firmare una richiesta HEAD anziché una richiesta GET per convalidare un file in questo modo.

+0

Grazie per la risposta. Dalla mia ricerca sembra che questa sia la risposta corretta data la mia esigenza di non usare l'SDK. Detto questo, ho ora implementato l'SDK nel plugin in quanto sembra la soluzione più robusta e dà accesso ad altre funzionalità che probabilmente userò. Grazie ancora. –