sap.ui.unified.FileUploader изменить http метод / разрешить публикацию на segw - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю над загрузкой файлов в UI5.Я не могу использовать fileupload через ассоциации, так как мне нужен двоичный файл перед записью в мою таблицу.

Проблема в том, что sap.ui.unified.FileUploader всегда использует метод POST HTTP, это вызывает ошибку в бэкэнд-системе:

405 Methode not allowed

Я нашел этот блог SAP FileUploader - 405 Метод не разрешен , в котором проблема решается путем расширения элемента управления иизменение метода HTTP.

У меня вопрос, есть ли более стандартный способ добиться этого?Я не нашел никакого свойства в элементе управления для настройки метода HTTP.

Параметры:

  • Может быть, в настройках XHR?
  • Можете ли вы разрешить POST в SEGW или пользовательские классы выхода?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Это может быть связано с поддержкой браузером UI5.

Под капотом загружается файл <div>, который содержит <form>.

Файл можно загрузить либо с помощью XMLHttpRequest (XHR), либо просто отправив форму. Поддерживаются только формы GET и POST.

Если вы хотите использовать PUT , первый шаг - это установка sendXHR="true".

Но XHR не работает в IE9. По какой-то причине разработчики UI5 решили:

Если IE9 не может использовать PUT, тогда никто не должен!

Итак, второй шаг - создать подкласс FileUploader, добавить новое свойство для метода HTTP и перезаписать метод _sendFilesWithXHR. Это так же стандартно, как и получается;)

Кстати это это строка, где они жестко закодированы "POST", которую необходимо заменить динамическим вызовом нового свойства httpMethod.

0 голосов
/ 08 ноября 2018

Загрузка / загрузка с 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  
    }
});
...