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

时间:2018-11-08 07:00:59

标签: file-upload odata sapui5 http-method

我正在UI5中上传文件。 我无法通过关联使用fileupload,因为在写表之前我需要二进制文件。

问题是sap.ui.unified.FileUploader始终使用POST HTTP方法, 这会在后端系统中导致错误:

  

405 Methode not allowed

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

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

选项:

  • 也许在XHR设置中?
  • 您可以在POST中允许SEGW还是用户退出类?

2 个答案:

答案 0 :(得分:0)

使用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  
    }
});

答案 1 :(得分:0)

这可能是由于UI5的浏览器支持。

文件上传器实际上是一个<div>,其中包含一个<form>

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

如果您想使用PUT第一步是设置sendXHR="true"

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

  

如果IE9无法使用PUT,那么没有人可以使用!

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

顺便说一句this是他们对其进行硬编码的行"POST",需要用动态调用新属性httpMethod来代替。