2013-09-05 13 views
5

Ich habe eine signierte $ URL für Amazon s3 erstellt und es öffnet sich perfekt im Browser.Prüfen, ob die Datei auf Amazon s3 Signierte URL

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

** Bucket Name und accesskey geändert in diesem Beispiel

ich aber versuche dann unter Verwendung der Funktion überprüfen (mit curl), dass die Datei vorhanden ist. Es schlägt die CURL-Verbindung fehl. Wenn ich $ URL oben durch die URL eines Bildes außerhalb von s3 ersetze, dann funktioniert dieser Code perfekt.

Ich weiß, dass die Datei in amazon existiert, aber kann nicht arbeiten, warum dieser Code schlägt fehl, wenn ein signiertes url wie oben

Irgendwelche Ideen mit?

Danke

Hier ist mein Code.

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

Wenn ich diesen Code verwende, um zu prüfen, ob die Datei auf s3 mit signierter URL vorhanden ist, da es ein privater Bucket ist (dh keine öffentliche Richtlinie), schlägt sie immer fehl, wenn die Verbindung fehlgeschlagen ist. –

+0

Tut mir leid, ich kann das mit dem AWS PHP SDK lösen, aber ich versuche, es ohne das SDK zu machen, da ich die Funktionalität in ein Wordpress Plugin einfüge. Danke –

Antwort

4

Wenn CURLOPT_NOBODY verwendet, sendet Libcurl eine HTTP-Anfrage HEAD, keine GET Anfrage.

... die Zeichenfolge zu unterzeichnen ist durch Anhängen des REST Verb, Content-md5 Wert, Content-Type-Wert gebildet, Parameterwert, canonicalized x-AMZ-Headern (siehe Rezept unten) abgelaufen ist, und die Ressource; alle durch Zeilenumbrüche getrennt.

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

Das "REST Verb" - zB GET vs HEAD - muss zwischen der Signatur, die Sie erzeugen, und die Anforderung in Einklang steht, die machen, so eine Signatur, die gültig ist für GET ist nicht gültig für HEAD und umgekehrt.

Sie müssen eine HEAD Anfrage anstelle einer GET Anfrage unterschreiben, um eine Datei auf diese Weise zu validieren.

+0

Danke für die Antwort. Scheint aus meiner Forschung, dass dies die richtige Antwort ist, wenn ich nicht SDK verwenden möchte. Nachdem ich das gesagt habe, habe ich nun das SDK in das Plugin implementiert, da es die stabilste Lösung zu sein scheint und Zugang zu anderen Funktionen bietet, die ich wahrscheinlich verwenden werde. Danke noch einmal. –

Verwandte Themen