sap.ui.unified.FileUploader 更改 http 方法/允许 post 在 segw 上

sap.ui.unified.FileUploader change http methode / allow post on segw

我正在 UI5 中上传文件。 我无法通过关联使用 fileupload,因为在写入 table.

之前我需要二进制文件

问题是 sap.ui.unified.FileUploader 总是使用 POST HTTP 方法, 这会导致后端系统出错:

405 Methode not allowed

我找到了这个 SAP 博客 FileUploader - 405 Method Not Allowed,其中通过扩展控件和更改 HTTP 方法解决了问题。

我的问题是有更标准的方法来实现吗?我没有在控件中找到任何配置HTTP方法的属性。

选项:

Upload/Download 与 SEGW

上传前的二进制文件:只能通过 Deffered 和 XHR 实现

getBase64Promise: function (file) {
        return new Promise(function (resolve, reject) {
            var reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = function () {
                var encoded = reader.result.replace("data:", "").replace(/^.*;base64,/, "");
                if ((encoded.length % 4) > 0) {
                    encoded += "=".repeat(4 - (encoded.length % 4));
                }
                resolve(encoded);
            };
            reader.onerror = function () {
                reject("error");
            };
        });
},


fileUploadChange: function (oControlEvent) {
        var that = this;
        var aFiles = oControlEvent.getParameters().files;
        var currentFile = aFiles[0];
        var sUrl = "yourNeeds..";
        this.getBase64Promise(currentFile).then(function (data) {
            that.xhrRequest(data, oView, sUrl);
        });
    },


xhrRequest: function (data, oView, url) {
        var oImage = "data:image/png;base64, " + data;
        oRequest = JSON.stringify(oImage);
        var xhrReadyStateChange = function () {
            if (this.readyState === this.DONE) {
                console.log("200", JSON.parse(this.response));
            }
        };

        var xhr = new XMLHttpRequest();
        xhr.withCredentials = false;
        xhr.addEventListener("readystatechange", xhrReadyStateChange);
        xhr.open("POST", url, false); // setting request method & API endpoint, the last parameter is to set the calls as synchyronous
        xhr.setRequestHeader("Accept", "application/json"); // adding request headers
        xhr.setRequestHeader("Content-Type", "application/json"); // adding request headers
        xhr.send(oRequest); // sending request  
    }
});

这可能是因为浏览器支持 UI5。

在幕后,文件上传器是一个 <div>,其中包含一个 <form>

可以通过 XMLHttpRequest (XHR) 或简单地提交表单来上传文件。表单仅支持 GETPOST.

如果你想使用PUT 第一步设置sendXHR="true".

但是 XHR 在 IE9 中不工作。出于某种原因,UI5 开发人员随后决定:

If IE9 cannot use PUT then no one should!

所以第二步是创建一个FileUploader的子类,为HTTP方法添加一个新的属性并覆盖_sendFilesWithXHR方法。这是最标准的 ;)

Btw this 是他们硬编码的行 "POST" 需要用新的动态调用替换 属性 httpMethod.