没有'Access-Control-Allow-Origin'标题,可恢复上传

Jkm*_*kmn 20 google-app-engine xmlhttprequest google-api google-cloud-storage

我们正在通过我们的App Engine应用程序中的云存储JSON API生成可恢复的上传URL,这些应用程序可用于移动设备和Web应用程序.在Web应用程序中,使用XmlHttpRequest上传具有可恢复上传URL的文件,我们收到以下错误:

XMLHttpRequest无法加载https://www.googleapis.com/upload/storage/v1beta2/b/ ...请求的资源上没有"Access-Control-Allow-Origin"标头.因此,不允许来源" https://ourapp.appspot.com "访问.

在Chrome开发人员工具中,网络日志显示第一个OPTIONS请求,其中包含相应的"Origin"请求标头和"Access-Control-Allow-Origin"响应标头,但后面提到的PUT请求失败.

我们的桶上的cors xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
    <CorsConfig>
      <Cors>
        <Origins>
          <Origin>*</Origin>
        </Origins>
        <Methods>
          <Method>PUT</Method>
          <Method>GET</Method>
          <Method>POST</Method>
          <Method>HEAD</Method>
          <Method>DELETE</Method>
          <Method>OPTIONS</Method>
        </Methods>
        <ResponseHeaders>
          <ResponseHeader>*</ResponseHeader>
        </ResponseHeaders>
        <MaxAgeSec>1800</MaxAgeSec>
      </Cors>
    </CorsConfig>
Run Code Online (Sandbox Code Playgroud)

欢迎任何建议.

谢谢.

小智 6

遇到这个问题并发现它是由于来自App Engine的初始POST请求中缺少"origin"头.

我的POST请求包含content-length(设置为0),x-upload-content-type和origin,一切都很好.

[1] https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload#resumable


Seb*_*ian -1

端点https://www.googleapis.com不允许跨源资源共享 (CORS)。这意味着所有浏览器都会阻止从不在原始主机 (www.googleapis.com) 上运行的网站发出的请求。

确保您为您的存储桶配置了 CORS,例如:

<?xml version="1.0" encoding="UTF-8"?>
<CorsConfig>
  <Cors>
    <Origins>
      <Origin>https://ourapp.appspot.com</Origin>
    </Origins>
    <Methods>
      <Method>GET</Method>
      <Method>HEAD</Method>
      <Method>PUT</Method>
    </Methods>
  </Cors>
</CorsConfig> 
Run Code Online (Sandbox Code Playgroud)

如果它仍然无法正常工作<Origin>*</Origin>,请尝试使用curl并报告结果。