我正在尝试通过AJAX从本地主机上的Google云存储中获取文件。我已经完成以下工作:
通过gsutil为我的存储桶设置CORS:
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
gsutil cors get gs://my-project
然后,对于每个文件,我都会通过上传文件时通过node.js客户端库将其公开:
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错误:
对预检请求的响应未通过访问控制检查:在所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源’ http:// localhost:3000 ‘。
我如何通过CORS?
您使用的是“ googleapis.com”,而不是“ www.googleapis.com”。添加“ www”,您的代码即可使用。
看来您没有进行任何身份验证,因此还需要确保您的存储桶允许匿名用户列出对象(gsutil acl ch -g allUsers:R gs://bucket- name将对此进行设置)。
gsutil acl ch -g allUsers:R gs://bucket- name
接下来,对于匿名请求,最好添加一个API密钥参数,以将请求与您的Google Cloud项目相关联。GCS将允许完全匿名的请求,但是如果它们变得过于频繁,则可能会被阻止。
最后,存储桶上的CORS策略仅受XML API的尊重。JSON API(端点为“ www.googleapis.com”的API)将很高兴地响应跨域请求,而无需在存储桶上设置任何特殊属性。