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很好。 –