如何在SAPUI5中使用oModel.create()方法

问题描述 投票:0回答:1

我在 Business Applications Studio SAPUI5 的控制器中有此方法,但它无法按预期工作。

我希望使用提供的 Objectkey 将文件附加到发票上,该对象与第二个函数完美配合,但是在执行第一个函数时,文件将被上传并发送到后端,但我无法打开它(更多信息如下)。

执行第一个函数时,我没有收到任何错误消息,上传过程成功,只是之后无法打开文件。

onFileSelected: function (oEvent) {
  var oFile = oEvent.getParameter("files")[0];
  if (oFile) {
    var reader = new FileReader();
    reader.onload = function (e) {
      var binaryContent = e.target.result;            
      var oModel = this.getView().getModel();
                            
      oModel.refreshSecurityToken(function (data, response) {
        var sToken = response.headers['x-csrf-token'];
        var sObjectKey = "Placeholder";
        var sObjectType = "BUS2081";
        var sFileName = oFile.name;
        var sSlug = btoa(sFileName);
        var sContentType = oFile.type;
                
        // Binary content as payload
        var oPayload = binaryContent;
                
        oModel.create("/OriginalContentSet", oPayload, {
          headers: {
            "x-csrf-token": sToken,
            "Slug": sSlug,
            "Objectkey": sObjectKey,
            "Objecttype": sObjectType,
          },
          success: function (data) {
            MessageToast.show("Success");
          },
          error: function (oError) {
            MessageToast.show("Error");
          }
        });
      }.bind(this), function () {
        MessageToast.show("Error with the CSRF Token");
      });
    }.bind(this);
    reader.readAsArrayBuffer(oFile); // Read file as binary ArrayBuffer (no Base64 encoding)
  } else {
    MessageToast.show("No file selected");
  }
}

我100%确定Slug、Contenttype、token等变量是正确的,因为我用占位符替换了一些变量,但这并不重要,出于隐私原因我只是为了这个问题这样做.

我还有另一种方法,效果非常好,但在该方法中,我使用了 Ajax 而不是 oModel.create。现在我想做同样的事情,但是使用 oModel.create,但它不起作用。该文件已正确上传,但当尝试打开时,它告诉我该文件无法打开,并且“它可能已损坏或预览无法识别格式”。 ...

我在上传过程中没有收到错误(有时我收到“没有数据处理程序”,但我只是在尝试不同的解决方案时才得到这一点......使用提供的代码我没有收到任何错误)。

我希望使用提供的 Objectkey 将文件附加到发票上,这两种方法都适用,但只有 Ajax 方法还允许我在上传文件后打开文件。

以下是与Ajax的工作方法对比:

onFileSelected: function (oEvent) {
  var oFile = oEvent.getParameter("files")[0];
  if (oFile) {
    var reader = new FileReader();
    reader.onload = function (e) {
      var binaryContent = e.target.result;            
      var oModel = this.getView().getModel();
                            
      oModel.refreshSecurityToken(function (data, response) {
        var sToken = response.headers['x-csrf-token'];
        var sObjectKey = "Placeholder";
        var sObjectType = "BUS2081";
        var sFileName = oFile.name;
        var sSlug = btoa(sFileName);
        var sContentType = oFile.type;
                
        $.ajax({
          url: "placeholder/OriginalContentSet",
          type: "POST",
          data: binaryContent,
          processData: false, 
          contentType: sContentType,
          headers: {
            "x-csrf-token": sToken,
            "Slug": sSlug,
            "Objectkey": sObjectKey,
            "Objecttype": sObjectType
          },
          success: function (data) {
            MessageToast.show("Success");
          },
          error: function (oError) {
            MessageToast.show("Error");
          }
        });
      }.bind(this), function () {
        MessageToast.show("Error.");
      });
    }.bind(this);
    reader.readAsArrayBuffer(oFile); // Read file as binary ArrayBuffer (no Base64 encoding)
  } else {
    MessageToast.show("No file selected");
  }
}

我尝试稍微更改代码,例如创建一个包含文件名和内容类型的有效负载对象,而不是仅将二进制内容保存到有效负载变量中,以及将变量从标头内的有效负载对象移动反之亦然,但结果总是一样的。

javascript sapui5
1个回答
0
投票

如果您使用 Odata v4,则 oModel.create 将不起作用。而是使用 .bindItems()

© www.soinside.com 2019 - 2024. All rights reserved.