Google云端存储 - 使用XMLHttpRequest直接上传会导致“Access-Control-Allow-Origin”错误

时间:2014-01-15 08:59:58

标签: google-app-engine gwt xmlhttprequest cors google-cloud-storage

我的以下问题使用:Java,GWT,jQuery,App Engine(GAE)。

有很多关于“Access-Control-Allow-Origin”头的问题,但似乎没有什么是我追求的。

我正在尝试使用POST Object将文件上传到Google云端存储。如果我只是使用html表单来实际上传,这可以正常工作。但是,一旦我尝试使用XMLHttpRequest发出完全相同的请求,我就会收到错误“No'Access-Control-Allow-Origin'标头出现在请求的资源上”。我遵循了setup CORS for a bucket - 指南。我的CORS xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CorsConfig>
  <Cors>
    <Origins>
      <Origin>*</Origin>
    </Origins>
    <Methods>
      <Method>GET</Method>
      <Method>POST</Method>
      <Method>HEAD</Method>
      <Method>DELETE</Method>
      <Method>OPTIONS</Method>
    </Methods>
    <ResponseHeaders>
      <ResponseHeader>x-goog-meta-foo1</ResponseHeader>
    </ResponseHeaders>
    <MaxAgeSec>1800</MaxAgeSec>
  </Cors>
</CorsConfig>

那我为什么要使用XMLHttpRequest呢?这是因为我希望能够将上传文件上传到Google云端存储(GCS)。我不确定我是否在某处犯了一些错误,或者在上传到GCS时甚至可能有上传进度。但据我所知,对此不应有任何限制,因为上传进程不是基于与GCS的通信(除了上传速度之外)。

我已经强行清理了我的缓存,但这没有用! :(

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

我真的不喜欢回答我自己的问题,因为在我问之前我似乎没有做足够的研究。但是我确实做到了,在我提出这个问题之前,我确实尝试了1.5天。

问题是CORS xml文件中的一行:

<ResponseHeader>x-goog-meta-foo1</ResponseHeader>

应替换为:

<ResponseHeader>*</ResponseHeader>

我真的不认为这会有任何不同,因为我认为'Access-Control-Allow-Origin'标题将默认发送,因为这就是我进行此设置和{{3}的原因}没有提到任何关于它的事情。我确实理解x-goog-meta-foo1是一个例子,但如果使用它会破坏设置(Google,请更新文档)。