使用从本地主机上载到GCS时出现CORS错误

使用从本地主机上载到GCS时出现CORS错误,cors,xmlhttprequest,google-cloud-storage,Cors,Xmlhttprequest,Google Cloud Storage,通过PUT请求将文件从本地主机上载到时,我遇到了CORS错误,同时将内容类型设置为image/png: Access to XMLHttpRequest at 'https://storage.googleapis.com/{{BUCKET_NAME}}/folder/image.png?Expires=1542676226&GoogleAccessId=XXXX&Signature=YYYY' from origin 'http://localhost:3000' has be

通过
PUT
请求将文件从本地主机上载到时,我遇到了CORS错误,同时将
内容类型设置为
image/png

Access to XMLHttpRequest at 'https://storage.googleapis.com/{{BUCKET_NAME}}/folder/image.png?Expires=1542676226&GoogleAccessId=XXXX&Signature=YYYY' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我已确保为开发目的尽可能宽松地设置bucket的CORS策略:

$ gsutil cors get gs://{{BUCKET_NAME}}

[
    {
      "origin": ["*"], // also tried "http://localhost:3000"
      "method": ["*"],
      "responseHeader": ["*"]
    }
]

不幸的是,除了403之外,我没有得到任何东西。

我花了一个小时来解决这个问题,最终意识到
内容类型是强制性的,它必须与您正在上载的文件的内容类型相匹配

在文件上设置正确的MIME类型后,上载成功

我使用了一个库来获取文件的正确MIME类型:

在我的案例中,我使用nodejs+
“@googlecloud/storage”:“^3.0.2”

创建签名url时,密钥是
版本。默认版本为
v2

const getSignedUrlResponse:getSignedUrlResponse=wait file.getSignedUrl({
动作:“写”,
过期日期:Date.now()+60*1000
//版本:“v4”
});
对于客户端,我使用
fetch
API,下面是代码片段:

fetch(signedUrl,{method'PUT',body:file})
chrome控制台中出现403 cors错误,如下所示:

把403

CORS策略已阻止从源“”获取“”的访问:请求的资源上不存在“访问控制允许源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

在我将
版本从
v2
更改为
v4
后:

const getSignedUrlResponse:getSignedUrlResponse=wait file.getSignedUrl({
动作:“写”,
过期日期:Date.now()+60*1000,
版本:“v4”
});
错误消失了


事实上,您需要解决的问题似乎是403,原因应该与您的CORS配置无关。您的CORS配置应该具有的唯一效果是向响应添加额外的头-它绝对不应该让服务器用403阻止任何请求。您使用什么方法来创建已签名的URL?