SAPUI5中oModel.create()上传文件无法打开的问题排查
问题分析与解决方案
问题根源
使用oModel.create()上传文件后损坏的核心原因是:SAPUI5的ODataModel(v2)默认会将请求payload序列化为JSON格式,你传入的二进制ArrayBuffer会被错误转换处理,导致文件内容篡改。而可用的$.ajax代码通过processData: false跳过数据序列化,同时显式指定文件contentType,确保二进制数据原样传输。
修复方案
在oModel.create()的配置参数中添加两个关键设置,和$.ajax保持一致:
processData: false:禁止模型自动序列化payload,直接发送原始二进制数据contentType: sContentType:显式指定文件的MIME类型,避免模型默认设置为application/json
修改后的代码
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; var oPayload = binaryContent; oModel.create("/OriginalContentSet", oPayload, { headers: { "x-csrf-token": sToken, "Slug": sSlug, "Objectkey": sObjectKey, "Objecttype": sObjectType, }, // 添加关键配置 processData: false, contentType: sContentType, 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); } else { MessageToast.show("No file selected"); } }
补充说明
如果使用OData v4模型,二进制上传需借助sap.ui.model.odata.v4.ODataModel的createStream方法处理,但从代码结构判断你使用的是v2模型,上述修复即可解决问题。
内容的提问来源于stack exchange,提问作者derMasterOfDesaster
相关产品推荐
相关产品推荐

