即使在启用CORS后仍无法上传到Google云存储

即使在启用CORS后仍无法上传到Google云存储,cors,google-cloud-storage,Cors,Google Cloud Storage,我已将此cors.json更新为GCS bucket: [ { "origin": ["*"], "method": ["GET", "POST", "HEAD", "DELETE", "PUT"], "responseHeader": ["Content-Type"],

我已将此cors.json更新为GCS bucket:

[
  {
    "origin": ["*"],
    "method": ["GET", "POST", "HEAD", "DELETE", "PUT"],
    "responseHeader": ["Content-Type"],
    "maxAgeSeconds": 3600
  }
]
使用:

gsutil cors set cors.json gs://my-bucket
我已经检查了飞行前的响应:

access-control-allow-headers: Content-Type
access-control-allow-methods: GET,POST,HEAD,DELETE,PUT
access-control-allow-origin: *
access-control-max-age: 3600
然而,上传带有此标题的文件的POST请求:

:authority: storage.googleapis.com
:method: POST
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,ta;q=0.8
content-length: 913
content-type: application/json
dnt: 1
origin: https://099e00581bf2.ngrok.io
由于CORS错误而失败:

Access to XMLHttpRequest at 'https://storage.googleapis.com/...' from origin 'https://099e00581bf2.ngrok.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我做错了什么?

  • 首先,从列表中删除所有可能的原因:
  • 清除你这边的所有缓存
  • 等待1-2小时:效果也可能由于中间缓存而延迟
  • 再试一次
  • 如果可行,通过添加您希望允许的方法、源和响应头,缩小在步骤1中创建的SUPER许可CORS配置的范围

如果上面的步骤还没有解决你的问题,我会考虑讲授这两个资源:


我找到了这个问题的答案。我用的是“POST”而不是“PUT”。因为我使用操作创建了签名url:“write”

gcsfile.getSignedUrl({
    action: 'write',
    contentType: req.body.contentType,
    expires: Date.now() + 1000 * 60 * 60
})
我应该在调用时使用“PUT”方法。一旦我改变了它,它就像一个符咒


但是,这个CORS错误是如此误导。希望GCS将来会抛出一些有意义的错误消息。

您可以尝试使用REST API和使用POST请求的访问令牌,而不是使用预签名url方法

以下是参考资料:

要生成访问令牌,请执行以下操作:

gcloud auth print-access-token

在方法中,是否也添加“选项”?我想?试过了,但没用:(谢谢!但是,这会在一段时间后过期。另外,对于匿名文件上传来说,分发过期时间较长的令牌也不是一个好主意。理想的过期时间是60分钟,但它是可配置的。所以我认为使用它没有任何害处。添加“responseHeader”为我修复了它!我不需要等待或刷新缓存,它立即开始工作。
gcloud auth print-access-token