我在 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");
}
}
我尝试稍微更改代码,例如创建一个包含文件名和内容类型的有效负载对象,而不是仅将二进制内容保存到有效负载变量中,以及将变量从标头内的有效负载对象移动反之亦然,但结果总是一样的。
如果您使用 Odata v4,则 oModel.create 将不起作用。而是使用 .bindItems()