Google cloud storage GCS已签名URL Post对象使用带有进度侦听器的XMLHttpRequest会导致浏览器发送选项而不是Post

Google cloud storage GCS已签名URL Post对象使用带有进度侦听器的XMLHttpRequest会导致浏览器发送选项而不是Post,google-cloud-storage,Google Cloud Storage,我已经使用XMLHttpRequest和angular$http从浏览器成功地实现了使用带有签名的多部分Post请求、策略文档等上传对象 但是,当我在XMLHttpRequest上载上附加事件侦听器以向用户显示进度条时,浏览器会发送一个选项方法,而不是POST。storage.googleapis.com返回200 ok之后,我希望浏览器会发送一篇包含该文件的帖子,但没有发生。如果没有上传侦听器,代码可以完美地工作。我应该搬过去放吗?有什么解决办法吗 factory.uploadFileToU

我已经使用XMLHttpRequest和angular
$http
从浏览器成功地实现了使用带有签名的多部分Post请求、策略文档等上传对象

但是,当我在XMLHttpRequest上载上附加事件侦听器以向用户显示进度条时,浏览器会发送一个选项方法,而不是POST。storage.googleapis.com返回200 ok之后,我希望浏览器会发送一篇包含该文件的帖子,但没有发生。如果没有上传侦听器,代码可以完美地工作。我应该搬过去放吗?有什么解决办法吗

factory.uploadFileToUrlXHR=函数(文件,obj){
var deferred=$q.deferred();
var fd=新FormData();
fd.append('key',obj.key);
fd.append('Content-Type',obj.contenttype)
fd.append('GoogleAccessId',obj.GoogleAccessId);
fd.append('保单',obj.policy);
fd.append('签名',obj.signature);
fd.append('file',file);
var XHR=new XMLHttpRequest();
XHR.addEventListener('load',函数(事件){
//警报('是的!数据已发送,响应已加载');
推迟。解决(事件);
});
XHR.upload.addEventListener(“进度”,函数(evt){
if(evt.长度可计算){
$log.info(“添加上载事件侦听器”+evt.loaded+“/”+evt.total);
}
},假);
//定义发生错误时发生的情况
XHR.addEventListener('error',函数(事件){
//警惕(‘哎呀!出了点问题’);
推迟。解决(事件);
});
//提出我们的要求
XHR.open('POST',obj.uri);
//发送FormData对象;自动设置HTTP头
XHR.send(fd);
回报。承诺;

}
我解决了这个问题

当您从浏览器使用POST将文件上载到Google云存储时,请将bucket名称附加到URL。在下面的代码中,obj.uri应该是“

open('POST',obj.uri);并从键中删除bucket名称。键应包含对象名称

fd.append('key',obj.key)

如果未将存储桶名称作为POST URL的一部分附加,浏览器将向发送选项请求。GCS将无法找到正确的CORS配置。CORS配置映射到存储桶名称

我应用的CORS配置示例

[
    {
      "origin": ["http://localhost:8282"],
      "method": ["OPTIONS","PUT","POST","GET", "HEAD", "DELETE"],
      "responseHeader": ["Content-Type"],
      "maxAgeSeconds": 3600
    }
]

我解决了这个问题,

当您从浏览器使用POST将文件上载到Google云存储时,请将bucket名称附加到URL。在下面的代码中,obj.uri应为“

XHR.open('POST',obj.uri);并从密钥中删除bucket名称。键应包含对象名称

fd.append('key',obj.key)

如果不将bucket名称作为POST URL的一部分追加,浏览器将向发送选项请求。地面军事系统将无法找到正确的CORS配置。CORS配置映射到bucket名称

我应用的CORS配置示例

[
    {
      "origin": ["http://localhost:8282"],
      "method": ["OPTIONS","PUT","POST","GET", "HEAD", "DELETE"],
      "responseHeader": ["Content-Type"],
      "maxAgeSeconds": 3600
    }
]