【问题标题】:Amazon s3 Javascript- No 'Access-Control-Allow-Origin' header is present on the requested resourceAmazon s3 Javascript-请求的资源上不存在“Access-Control-Allow-Origin”标头
【发布时间】:2015-04-18 13:54:17
【问题描述】:

我正在尝试通过以下方式上传我的文件:

console.log("not broken til here");
    scope.inputMemeIsFile=true;
    var bucket = new AWS.S3({params: {Bucket: 'townhall.images'}});
    file = image.file;
    console.log(file);

    var params = {Key: file.name, ContentType: file.type, Body: file};
      bucket.upload(params, function (err, data) {
        var result = err ? 'ERROR!' : 'UPLOADED.';
        console.log(result);
        console.log(err);
      });

但是,我收到以下错误:

XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKETNAME>/favicon.jpg. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access.

带有progressingError:Network Failure {message: "Network Failure", code: "NetworkingError", time: Tue Feb 17 2015 13:37:06 GMT-0500 (EST), region: "us-east-1", hostname: "s3.amazonaws.com"…}

我的 CORS 配置如下所示,我尝试了几件事,但都没有成功。

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

有人知道怎么回事吗?我看过 5-6 篇类似的帖子,但似乎没有人能够解决这个问题。

【问题讨论】:

    标签: javascript amazon-s3 upload cors


    【解决方案1】:

    当前的答案已经过时了。所以这是我的分享:

    首先,您需要在 AWS S3 存储桶上设置 CORS

    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "GET",
                "PUT",
                "POST",
                "DELETE",
                "HEAD"
            ],
            "AllowedOrigins": [
                "http://*",
                "https://*"
            ],
            "ExposeHeaders": [
                "Access-Control-Allow-Origin",
                "ETag"
            ],
            "MaxAgeSeconds": 3000
        }
    ]
    

    只是关于 S3 的 cors 的注释。应用策略时,存储桶中已有的文件不会更新。因此,请确保仅将 CORS 策略应用于新存储桶,或在应用策略后重新添加内容。旧内容不会受到新 CORS 政策的影响

    amazon S3 如何评估 CORS?

    • 请求的 Origin 标头必须与 AllowedOrigin 元素匹配。
    • 请求方法(例如,GET 或 PUT)或在预检 OPTIONS 请求的情况下的 Access-Control-Request-Method 标头必须是 AllowedMethod 元素之一。
    • 预检请求的 Access-Control-Request-Headers 标头中列出的每个标头都必须与 AllowedHeader 元素匹配。

    对于最后一步,您还需要清除浏览器上的缓存,因为浏览器可能会缓存以前的飞行前请求

    【讨论】:

      【解决方案2】:

      某些浏览器(例如 Chrome)不支持对 CORS 请求使用 localhost127.0.0.1

      尝试改用:http://lvh.me:5000/

      请参阅https://stackoverflow.com/a/10892392/1464716 了解更多信息。

      【讨论】:

      • 只是累了,效果一样。这是一个很好的建议,但我没有尝试过,还有其他建议吗?
      • 这实际上对我有用。我尝试在 Safari 中使用建议的 CORS 标头而不是 Chrome 和瞧。
      • 这对我有用。在我想了解http://lvh.me 的过程中,我发现了localho.st,它在我的CORS 配置中更具自我记录性。
      【解决方案3】:

      为了通过浏览器上传文件,您应该确保您已经为您的 Amazon S3 存储桶配置了 CORS,并通过 ETag 声明公开了“ETag”标头。

      我建议您从开放式测试配置开始,然后根据您的需要对其进行修改:

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

      然后检查您的存储桶权限和您的 AWS 配置(accessKeyIdsecretAccessKeyregion),因为这些都不存在于您的 sn-p 中。

      为了进行测试,请转到您的 IAM 管理控制台并创建一个名为 prefix-townhall-test 的新 IAM 用户,然后使用此简单策略创建一个组,该策略授予对存储桶的访问权限:

      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::test-bucket-name"]
          },
          {
            "Effect": "Allow",
            "Action": [
              "s3:PutObject",
              "s3:GetObject",
              "s3:DeleteObject"
            ],
            "Resource": ["arn:aws:s3:::test-bucket-name/*"]
          }
        ]
      }
      

      确保您创建的用户正在使用具有此策略的新组。

      现在创建一个简单的测试脚本,就像在亚马逊上使用的那样:

      HTML

      <input id="file-chooser" type="file" />
      <button id="upload-button">Upload</button>
      <p id="results"></p>
      

      代码(DOM 就绪)

      // update credentials
      var credentials = {accessKeyId: 'new accessKeyId', secretAccessKey: 'new secretAccessKey'};
      AWS.config.update(credentials);
      AWS.config.region = 'us-west-1';
      
      // create bucket instance
      var bucket = new AWS.S3({params: {Bucket: 'test-bucket-name'}});
      
      var fileChooser = document.getElementById('file-chooser');
      var button = document.getElementById('upload-button');
      var results = document.getElementById('results');
      button.addEventListener('click', function() {
          var file = fileChooser.files[0];
          if (file) {
              results.innerHTML = '';
      
              var params = {Key: file.name, ContentType: file.type, Body: file};
              bucket.upload(params, function (err, data) {
                  results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
              });
          } else {
              results.innerHTML = 'Nothing to upload.';
          }
      }, false);
      

      【讨论】:

      • 也尝试过 ETag 变体和你上面说的那个,同样的问题。
      • 就配置而言...
      • @user3525295 我已经更新了我的答案,为您提供了一个小型测试环境。它适用于我的 javascript AWS SDK 并允许我上传就好了。如果你愿意,我什至可以把这个例子放在一个小提琴中,但最终可能会删除用户。
      • @user3525295 您的错误似乎表明存储桶不在us-east-1 中。您能否确保该请求将发送至us-west 或任何北加利福尼亚州。让我在北加州做一个测试桶并测试一下。
      • @user3525295 我刚刚在北加州进行了测试,它与AWS.config.region = 'us-west-1'; 和使用示例 CORS 配置的存储桶一起工作得很好。
      【解决方案4】:

      您是否尝试过指定来源而不是使用通配符。我很确定我们过去也遇到过类似的问题。

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

      【讨论】:

        【解决方案5】:

        试试&lt;AllowedOrigin&gt;*&lt;/AllowedOrigin&gt;,不用协议。

        如果没有效果——你可能在客户端有问题。

        【讨论】:

        • 我已经试过了。您能否详细说明您将如何解决客户端问题?
        • 如果您在 CORSRules 部分中有它,您的客户端可能会以某种方式缓存 &lt;MaxAgeSeconds&gt;ZillionSeconds&lt;/MaxAgeSeconds&gt;。即使您在客户端缓存其值后删除它,浏览器也不会尝试使用 OPTIONS 请求重新读取 CORS,直到 ZillionSeconds 周期结束。为了确保 OPTIONS 请求,您可以 a) 清除用户代理缓存,b) 对于 Chrome – 打开控制台,然后设置并设置控制台打开时无缓存。
        • 我的 javascript 控制台已打开,缓存已被删除。
        猜你喜欢
        • 2018-06-20
        • 1970-01-01
        • 2014-04-06
        • 2021-05-15
        • 2013-11-29
        • 2014-07-28
        • 2014-01-19
        相关资源
        最近更新 更多