S3:没有'Access-Control-Allow-Origin'用于AJAX POST

时间:2014-05-01 17:23:33

标签: ajax amazon-s3 cors jquery-file-upload

这个问题让我有点疯狂。我试图通过AJAX POST将文件上传到S3存储桶。

我的所有凭据都是正确的,因为当我执行正常的HTTP POST时,它会在S3存储桶中创建资源。但我真的想用进度条一次上传多个文件,因此我需要AJAX。

我的S3存储桶上有CORS设置:

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

现在我只是想在我的开发环境中使用它(localhost:3000,使用标准的Rails 4.1)。

根据我的理解,上面的CORS规则应该允许从localhost:3000到S3存储桶的AJAX请求。

但是,每次我通过AJAX提交文件时,都会收到以下错误:

XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKET>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

这对我没有任何意义,因为localhost:3000通过CORS规则被授予访问权限。

我还提供了用于提交表单的JS的片段:

  $.ajax({
    method: "POST",
    crossDomain: true,
    url: "https://s3.amazonaws.com/<BUCKET>",
    data: $(this).serialize() # Contains S3 necessary values
  })

表单包含必要的Amazon S3密钥/ etc的输入。我知道它们有效,因为当我执行正常的HTTP POST时,它会在S3中正确创建资产。我试图做的就是AJAX化这个过程。

我错过了一些明显的东西吗?

使用:Rails 4.1,jquery-file-upload,fog gem(用于S3)

2 个答案:

答案 0 :(得分:2)

您可以尝试更改

<?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>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

答案 1 :(得分:0)

您的问题似乎与我遇到的问题非常相似,但从未正确(精确地)回答问题,而且似乎是与浏览器限制相关的问题,而不是其背后的实际传输技术。

这是我原始问题的链接以及我在此收到的答案: Why Doesn't Microsoft Skydrive Download Multiple Files via API?

希望这可以为您的问题提供一些见解,而不仅仅是噪音。