2015-01-11 27 views
0

我使用Amazon S3作爲後端。我正確配置了存儲桶以允許CORS從我的域中獲取任何內容。 我測試過,它適用於常規文件(即通過Amazon AWS控制檯或S3命令行工具上傳)。Amazon S3 CORS請求上傳文件失敗

我的應用程序還將JSON文件本身上傳到S3存儲桶。有趣的是,它需要CORS正確配置上傳才能成功。它和我的JSON文件放入存儲區。

的問題是,當我提出一個CORS GET請求(jQuery的$.ajax這些文件我之前上傳,請求失敗,出現典型的消息

No 'Access-Control-Allow-Origin' header is present on the requested resource. 

請記住,使用任何其他文件在應用程序未上傳的同一個存儲桶中,路徑相同但來自控制檯或命令行工具的請求成功。

這是怎麼發生的?

我CORS配置:

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

你在通過本地主機進行ajax請求嗎?這是否可能是一個同源政策問題(https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy)? –

+0

這不是因爲GET請求只對先前從應用程序**上載的文件**失敗,如果我通過S3控制檯或S3CMD將它們上載,它會成功。 – rupps

+0

你可以發佈你的JavaScript代碼嗎? –

回答

0

某處jQuery的文檔中,可以找到$就一個選項。

jQuery.support.cors = true; 
... 
$.ajax(
    url, 
    { 
     crossDomain: true, 
     data: { 
      sampleData 
     }, 
     success: function() { 
      alert('Yeaaahhh') 
     }, 
     error: function(a,b,c) { 
      alert('failed'); 
     }, 
     type: 'post' 
    } 
); 

但是,您最好使用XMLHTTPRequest。像:

var xhr = new XMLHTTPRequest; 
xhr.open('POST', url); 
xhr.onreadystatechange = function(state, status){ 
    //do something 
}; 

xhr.onload = function(event){ 
    //do something 
}; 

xhr.onerror = function(event){ 
    //do something 
}; 

xhr.send(data); 

歡迎。