带有签名URL的Google Cloud Storage上传会在实际请求时出现cors问题

时间:2019-04-07 09:47:17

标签: javascript cors xmlhttprequest google-cloud-storage

我有一个奇怪的问题,似乎无法解决。我有一个Google Cloud Storage存储桶,我想在其中从网页上载文件。在后端(App Engine)中,我创建了可用于上传文件的签名URL。当我在Postman中使用带有签名的URL以及PUT请求和文件时,该文件已成功上传到我的存储桶中。

当我在网页上执行相同操作时,将变得很棘手。 我在网页中创建了以下代码:

var req = new XMLHttpRequest();
req.open("PUT", resp.url);
req.setRequestHeader("Content-Type", parameters.contentType);
req.onload = function(event) {
    this.loadFileList();
}.bind(this);
req.send(this.$.fileInput.files[0]);

这给了我预检请求(选项)的CORS问题。经过一番阅读后,我想出了在Google Cloud Storage上设置CORS配置的方法。所以我设置了以下配置:

[
  {
    "origin": ["https://my-website"],
    "responseHeader": ["Content-Type"],
    "method": ["GET", "HEAD", "PUT", "OPTIONS", "POST"],
    "maxAgeSeconds": 3600
  }
]

当我将此配置放到Google Cloud Storage上时,我看到预检请求开始工作,但是实际请求仍然失败,并出现以下错误:

  

跨源请求被阻止:同源策略禁止阅读   位于的远程资源   https://storage.googleapis.com/[my-bucket].appspot.com/games/dev/game-[game]/game-pictures/[file].jpg?GoogleAccessId=[account]&Expires=[expires]&Signature=[signature]。   (原因:CORS标头“ Access-Control-Allow-Origin”缺失)。

(我替换了网址的某些部分,以使我不暴露任何有关我的存储桶的信息)

实际错误为真。实际请求的响应中缺少Access-Control-Allow-Origin,但预检请求的响应中存在。

那么,我应该在实际请求的响应中获得Access-Control-Allow-Origin吗?我为什么不明白呢?我该如何解决?

1 个答案:

答案 0 :(得分:0)

请阅读以下文章,该文章清楚地说明了使用Java脚本进行调用时如何解决cors。 https://developers.google.com/api-client-library/javascript/features/cors