使用从本地主机上载到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?