请求的资源(AWS、API 网关、S3、CORS)上不存在“Access-Control-Allow-Origin”标头

时间:2021-04-02 15:43:47

标签: javascript amazon-web-services amazon-s3 cors aws-api-gateway

我正在尝试使用 API Gateway SDK 将图像文件上传到我的 S3 存储桶。 但是我不断收到以下错误:

Access to XMLHttpRequest at 'https://*****.execute-api.*****.amazonaws.com/dev/upload/photophotobucket/me.png' from origin 'http://photofront.s3-website-*****.amazonaws.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

下面是我点击上传时启动的javascript代码:

var apigClient = apigClientFactory.newClient();

function UploadFile() {
    var filePath = document.getElementById('file_path').value //C:\fakepath\me.png
    var file = document.getElementById('file_path').files[0]
    var reader = new FileReader()
    document.getElementById('file_path').value = ""
    if ((filePath == "") || (!['png', 'jpg', 'jpeg'].includes(filePath.split(".")[1]))) {
      alert("WRONG FILE!! Please upload a valid PNG or JPG file")
    } else {
      var params = {
        bucket: 'photophotobucket',
        key: filePath.split("\\").slice(-1)[0], // "me.png"
        'Content-Type': file.type
      };
      var body = {}
      var additionalParams = {
        headers: {
          'x-api-key': 'MYAPIKEY',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Methods': 'OPTIONS,PUT'
        },
        queryParams: {}
      };
      reader.onload = function (event) {
        body = btoa(event.target.result)
        console.log("body")
        console.log(body)
        var whatToReturn = apigClient.uploadBucketKeyPut(params, body, additionalParams)
          .then(function (result) {
          })
          .catch(function (error) {
          });
        return whatToReturn
      }
      reader.readAsBinaryString(file)
    }
  }

我在我的 API 网关上为 PUT 方法启用了 CORS。 (一切都得到了检查标记)。 我尝试使用和不使用 Access-Control-Allow 标头,它们都不起作用。 我错过了什么?

在 API Gateway 控制台上,我已经设置了“200 的响应标头”。我已经使用“*”设置了集成响应头映射

如果您需要任何其他信息,请询问。

1 个答案:

答案 0 :(得分:0)

错误消息指出它是 Preflight 请求(也就是资源上的 Options 方法)没有正确的 Access-Control-Allow-Origin 设置。如果您选择 Options 方法并编辑 Method Response > Response Headers,您应该会列出 Access-Control-Allow-Origin。下一步是为它设置一个值。编辑集成响应 > 标头映射 > Access-Control-Allow-Origin 并将值设置为 '*'(带单引号)。这使得它在您的故障排除期间完全开放,您可以稍后将值更改为更具体的,例如 'https://example.com'

在这一步之后,您可能会遇到后续错误,PUT 方法调用说明了同样的事情。您可以对 Put 方法执行这些相同的步骤(将 Access-Control-Allow-Origin 添加到方法响应 & 并将 '*' 添加到集成响应)。