0

我试图通过AJAX从本地主机上的谷歌云存储获取文件。我也做了以下内容:谷歌云存储忽略访问控制源标题

通过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

验证它

然后对于每个文件,我已经公开,通过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) 
     }) 

,我仍然获得科斯错误:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:3000 ' is therefore not allowed access.

如何通过CORS?

回答

1

您正在使用“googleapis.com”而不是“www.googleapis.com”。添加“www”,你的代码将起作用。

看起来您并未进行任何身份验证,因此您还需要确保您的存储桶允许匿名用户列出对象(gsutil acl ch -g allUsers:R gs://bucket-name将设置该对象)。

接下来,对于匿名请求,最好添加一个将请求与您的Google Cloud项目相关联的API密钥参数。 GCS将允许完全匿名的请求,但如果它们太频繁可能会被阻止。

最后,只有XML API支持存储桶上的CORS策略。 JSON API是端点为“www.googleapis.com”的JSON API,它将愉快地响应跨域请求,而无需在存储桶上设置任何特殊属性。

+0

非常有帮助的回复 - 谢谢! – mheavers

+0

以下是我的终端格式:“storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]”,是否意味着将其更改为“www.storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]”“? – KevinHu

+0

storage.googleapis.com/BUCKET/OBJECT很好。 –