2015-01-11 29 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); 

欢迎。