首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有进度监听器的XMLHttpRequest的GCS签名URL对象会导致浏览器发送选项而不是Post

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

Stack Overflow用户
提问于 2017-03-27 14:18:03
回答 1查看 451关注 0票数 1

我使用带签名的多部分Post请求,使用XMLHttpRequest和angular $http从浏览器上传策略文档GCS POST ...etc,成功实现了对象的上传。

但是,当我在XMLHttpRequest上传时附加事件侦听器以向用户显示进度条时,浏览器发送的是Options方法而不是POST。storage.googleapis.com返回200,ok之后,我期望从浏览器发送一个带有文件的POST,但这并没有发生。没有上传侦听器,代码就可以完美地工作。我应该移动到PUT吗?任何解决方法

代码语言:javascript
复制
   factory.uploadFileToUrlXHR = function(file,obj){
         var deferred = $q.defer();
         var fd = new FormData();
         fd.append('key', obj.key);
         fd.append('Content-Type',obj.contenttype)
         fd.append('GoogleAccessId', obj.googleaccessId);
         fd.append('policy', obj.policy);
         fd.append('signature', obj.signature);
         fd.append('file', file);
         var XHR = new XMLHttpRequest();
         XHR.addEventListener('load', function(event) {
           //  alert('Yeah! Data sent and response loaded.');
             deferred.resolve(event);
         });

       XHR.upload.addEventListener("progress",function(evt){
              if (evt.lengthComputable) {
                 $log.info("add upload event-listener" + evt.loaded + "/" + evt.total);
               }
            }, false);

  // Define what happens in case of error
        XHR.addEventListener('error', function(event) {
          //alert('Oups! Something went wrong.');
          deferred.resolve(event);
         });

  // Set up our request
        XHR.open('POST', obj.uri);

  // Send our FormData object; HTTP headers are set automatically
        XHR.send(fd);
         return deferred.promise;
    }

EN

回答 1

Stack Overflow用户

发布于 2017-03-27 18:30:37

我解决了这个问题,

在浏览器中使用POST将文件上传到Google Cloud存储时,将存储桶名称附加到URL。在下面的代码中,obj.uri应该是"https://storage.googleapis.com/bucketname

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

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

如果您不将存储桶名称作为POST URL的一部分,浏览器将向https://storage.googleapis.com/发送Options请求。GCS将无法找到正确的CORS配置。CORS配置映射到存储桶名称。

我已经应用了CORS配置示例。

代码语言:javascript
复制
[
    {
      "origin": ["http://localhost:8282"],
      "method": ["OPTIONS","PUT","POST","GET", "HEAD", "DELETE"],
      "responseHeader": ["Content-Type"],
      "maxAgeSeconds": 3600
    }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43039135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档