我正在尝试通过我本地主机上的Google Cloud Storage通过AJAX获取文件。我做了以下操作:
通过gsutil设置我的水桶的COR:
gsutil cors set cors.json gs://my-project
cors.json文件是:
[
{
"origin": [
"*"
],
"responseHeader": ["Origin", "Accept", "X-Requested-With", "Authorization", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token"],
"method": [
"GET",
"OPTIONS"
],
"maxAgeSeconds": 1
}
]
我已经用gsutil cors get gs://my-project
然后,对于每个文件,当文件上传时,我都通过node.js client库公开它:
bucket.file(object.name).makePublic()
通过控制台,并通过gsutil:
gsutil -m acl set -R -a public-read gs://my-project
然后在我的ajax请求中,我也发送标头:
$.ajax({
method: "GET",
url: "https://googleapis.com/storage/v1/b/my-project/o?delimiter=audio",
headers: {
'Access-Control-Allow-Origin': '*'
},
crossDomain: true,
}).done((data) => {
console.log(data)
})
我仍然会遇到CORS错误:
对飞行前请求的响应不会传递访问控制检查:否 请求的"访问控制"标头 资源。因此,不允许来源'http://localhost:3000' 访问。
我如何越过CORS?
您正在使用" googleapis.com",而不是" www.googleapis.com"。添加" www",您的代码将起作用。
看来您没有进行任何身份验证,因此您还需要确保您的存储桶允许匿名用户列出对象(gsutil acl ch -g allUsers:R gs://bucket-name
将设置该对象(。
接下来,对于匿名请求,最好添加一个将请求与您的Google Cloud Project关联的API密钥参数。GCS将允许完全匿名请求,但是如果它们过于频繁,它们可能会被阻止。
最后,仅XML API尊重存储桶上的CORS策略。JSON API是具有" www.googleapis.com"终点的JSON API,将愉快地回复交叉原始请求,而无需在存储桶上设置任何特殊属性。