2013-09-05 58 views
5

我已經爲亞馬遜s3創建了一個簽名的$ URL,並且它在瀏覽器中完美打開。檢查亞馬遜s3上是否存在文件簽名的URL

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

**桶名稱和ACCESSKEY在這個例子中

但是我想,然後使用下面的函數來檢查(使用curl)文件是否存在改變。它失敗了CURL連接。如果我使用s3之外的圖像的URL替換上面的$ URL,那麼這段代碼完美地工作。

我知道文件存在於亞馬遜偏偏這個代碼失敗,如果使用的是已簽署的網址如上

任何想法不能工作了?

感謝

這裏是我的代碼。

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

當我使用此代碼來檢查文件是否與已簽署的網址S3存在,因爲它是一個專用桶(即沒有公共政策),它總是失敗,「連接失敗」,表明捲曲連接本身失敗。 –

+0

對不起,我很容易用AWS PHP SDK來解決這個問題,但是我試圖讓它在沒有SDK的情況下工作,因爲我將這個功能添加到wordpress插件中。謝謝 –

回答

4

當使用CURLOPT_NOBODY,libcurl中發送HTTP請求HEAD,而不是一個GET請求。

...要簽名通過附加REST動詞,內容-MD5值,內容類型值所形成的字符串,過期的參數值,規範化的X AMZ頭(見下面的配方),並資源;全部由換行符分隔。

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

的「REST動詞」 - 例如,GET VS HEAD - 一定是你生成簽名,併發出請求,所以簽名是有效的之間是一致的GET將不適用於HEAD,反之亦然。

您需要簽署HEAD請求而不是GET請求才能以此方式驗證文件。

+0

謝謝你的回答。從我的研究看來,根據我的要求不使用SDK,這是正確的答案。話雖如此,我現在已經將SDK實施到插件中,因爲它看起來是最強大的解決方案,並且可以訪問我可能會使用的其他功能。再次感謝。 –