2015-09-29 75 views
1

由於CORS阻止系統,我無法在S3存儲桶上直接上傳(javascript XHR)。 我使用PHP來產生一個直接上傳鏈接,帶有上傳的政策和S3簽名:Amazon S3直接上傳:CORS錯誤

{"key": "501/source/${filename}", "AWSAccessKeyId": "AKIAIIG**********", "acl": "private","policy": "ey JleHBpcmF0aW***************", "signature": "j2UnJRfj+uC+FazEF+wPnuJpdcs=", "success_action_status": "201"}

但是當我嘗試將文件上載到生成的鏈接,我從火狐以下錯誤:

請求被阻止:相同來源策略不允許讀取在https://my.bucket.s3.amazonaws.com處的遠程 資源。這可以通過將資源移動到同一個域或啓用CORS來修復。

我鬥正確使用CORS策略配置爲允許POST來自世界各地:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>*</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <AllowedMethod>DELETE</AllowedMethod> 
     <AllowedMethod>HEAD</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

更重要的是,我應該怎麼辦?

這裏是PHP代碼,我用它來生成政策& S3簽名:

$key = '42/source/'; 
$policy = json_encode(array(
    'expiration' => date('Y-m-d\TG:i:s\Z', strtotime('+6 hours')), 
    'conditions' => array(
     array('bucket' => 'my.bucket'), 
     array('acl' => 'private'), 
     array('starts-with', '$key', $key), 
     array('success_action_status' => '201') 
    ) 
)); 
$policy = base64_encode($policy); 
$signature = base64_encode(hash_hmac('sha1', $policy, 'G3wzaTNwnQC2mQB3****************', true)); 
return array(
    'key' => $key.'${filename}', 
    'AWSAccessKeyId' => 'AKIAIIG**********', 
    'acl' => 'private', 
    'policy' => $policy, 
    'signature' => $signature, 
    'success_action_status' => '201' 
); 

我使用這個數組則params的在我的JavaScript fileupload()腳本直接上傳到亞馬遜S3(XHR請求)。

感謝您的幫助, 菲利普S.

+0

如果你運行'curl -I https:// my.bucket.s3.amazonaws.com /'或其他東西來查看頭文件,你會得到一個缺少所有預期的'Access-Control -'頭文件的響應嗎?還是缺少一些而不是其他的? – sideshowbarker

回答

0

如果有人被卡住了,從來沒有使用點「」在您的存儲桶名稱中。 它導致一些SSL證書麻煩,作爲一個新的子域。例如:您將您的存儲桶命名爲「my.bucket」,那麼它將被理解爲「存儲桶」的「我的」子域。

只需使用「 - 」或「_」而不是點。