2016-08-01 208 views
0

当我尝试使用UploadCollection上传文件时,我收到403 Forbidden错误。 在我view.js的代码是:无法在SAPUI5中使用UploadCollection上传文件

 var oOUpload = new sap.m.UploadCollection("oinspupload",{ 
     multiple : true, 
     sameFilenameAllowed : true, 
     instantUpload : false, 
     uploadUrl : "/sap/opu/odata/sap/ZACCBILL_SRV/FileSet", 
/*  uploadComplete : function(oEvent){ 
      //alert ("File Uploaded successfully"); 
     // oController.fileUpload(oEvent); 
     }, */ 
     fileDeleted : function(oEvent){ 
      oController.fileDelete(oEvent); 
     }, 
     fileRenamed : function(oEvent){ 
      alert ("File renamed successfully"); 
      //oController.fileRename(oEvent); 
     } 
    }); 

在我view.controller的代码是:

  OData.request({ 
       requestUri : sServiceUrl, 
       method : "GET", 
       headers : 
       { 
        "X-Requested-With" : "XMLHttpRequest", 
        "Content-Type" : "application/atom+xml", 
        "DataServiceVersion" : "2.0", 
        "Authorization" : AuthToken, 
        "X-CSRF-Token" : "Fetch" 
       } 

      }, 
      function(data, response) { 
       debugger; 
       if(sap.ui.Device.browser.chrome || sap.ui.Device.browser.msie || sap.ui.Device.browser.safari){ 
        header_xcsrf_token = response.headers['x-csrf-token']; 
       }else if(sap.ui.Device.browser.firefox){ 
        header_xcsrf_token = response.headers['X-CSRF-Token']; 
       } 
       xcsrf_token_ref.header_xcsrf_token = header_xcsrf_token; 
       csrftoken = xcsrf_token_ref.header_xcsrf_token; 
      debugger; 
      uploadattachments(xcsrf_token_ref); 
      }, 
      function(err) { 
       debugger; 
       var request = err.request; // the request that was sent. 
       var response = err.response; // the response that was received. 
       alert("Error in Get -- Request " 
         + request + " Response " 
         + response); 
      }); 


    function uploadattachments(token){ 
debugger; 
    var uploader;   
     uploader= sap.ui.getCore().byId("oinspupload"); 

     var aItems = uploader.getItems(); 
      var slug, sequence; 
      for (i = 0; i < aItems.length; i++) { 
      sequence = i + 1; 
      slug = "CONTAINERID1000040100;STATUSIB;SEQUENCE" + sequence+   ";FILENAMECamera.png" ; 
    uploader.addHeaderParameter(new sap.m.UploadCollectionParameter({name: "slug", value: slug })); 
    debugger; 
    uploader.addHeaderParameter(new sap.m.UploadCollectionParameter({name: "X-Csrf-Token", value: token.header_xcsrf_token })); 

    uploader.upload(); 
} 
} 

请不要介意缺少的括号就像上面的代码是不完整的代码。

上面的代码对fileuploader工作正常。我确信问题是uploadcollection没有正确传递获取的CSRF令牌,但我无法弄清楚什么是错误的。

+0

有人能帮我解决这个问题吗? –

回答

0

终于找到了自己的解决方案具有以下博客的帮助 http://scn.sap.com/community/developer-center/front-end/blog/2016/03/29/using-the-uploadcollection-to-uploaddownload-archivelink-files-via-gateway

上传收集只instantUpload作品为真,不与instantUpload假的版本1.32.X.的工作UploadCollection是Buggy,并且在未来的版本中尚未纠正。此外CSRF令牌验证需要在更改事件中完成。下面是代码:

View.js

var oOUpload = new sap.m.UploadCollection("oinspupload",{ 
     multiple : true, 
     sameFilenameAllowed : false, 
     instantUpload : true, 
     uploadUrl : "/sap/opu/odata/sap/ZACCBILL_SRV/FileSet", 
     fileDeleted : function(oEvent){ 
      oController.fileDelete(oEvent); 
     }, 
     fileRenamed : function(oEvent){ 
      alert ("File renamed successfully"); 
     }, 
     change: function(oEvent) { 
      debugger; 
      csrftoken = xcsrf_token_ref.header_xcsrf_token; 
      var oUploadCollection = oEvent.getSource(); 
      var oCustomerHeaderToken = new sap.m.UploadCollectionParameter({ 
       name : "x-csrf-token", 
       value : csrftoken 
      }); 
      oUploadCollection.addHeaderParameter(oCustomerHeaderToken); 
     }, 
    }); 
0

所有头PARAMS必须从 “变化” 功能被加入。如果您将其添加后,它们将不会被接收到后端。

另外,可以使用instantUpload = false上传文件。你只需要绑定uploadUrl参数和视图模型的paremeter,动态地,当你改变url时它会改变。

例如:

View元素:

<UploadCollection instantUpload="false" uploadUrl="{ResourceModel>/sServiceUrl}"/> 

控制器onInitFunction:

var resourcemodel = this.getOwnerComponent().getModel("ZGW_PURCHREQ_01_SRV"); 
var oDataResource = { 
    sServiceUrl: resourcemodel.sServiceUrl + "/FileSet" 
}; 
var jsonResource = new JSONModel(oDataResource); 
this.getView().setModel(jsonResource, "ResourceModel"); 

当你火载时,它就会发出请愿书的uploadURL的 “sServiceUrl” 的定义“ ResourceModel”。

其他选项设置上传的URL和/或新的报头PARAMS之前火上传功能有:

var oUploadCollection = this.getView().byId("UploadCollection"); 
var sServiceUrl = resourcemodel.sServiceUrl + "/FileSet"; 
var headerBanfn = new sap.ui.unified.FileUploaderParameter({ 
    name: "banfn", 
    value: "123456" 
}); 
for (var i = 0; i < oUploadCollection._aFileUploadersForPendingUpload.length; i++) { 
    oUploadCollection._aFileUploadersForPendingUpload[i].setUploadUrl(sServiceUrl); 
    oUploadCollection._aFileUploadersForPendingUpload[i].addHeaderParameter(headerBanfn); 
} 
       oUploadCollection.upload(); 

我希望这是有益的。