Загрузить Excel в Slack с помощью API files.upload — файл загружается, но поврежден

Я использую Slack API files.upload для загрузки документа Excel, полученного из ответа AJAX. Я использую AJAX jQuery для загрузки, и файл загружается правильно, за исключением того, что он поврежден. Когда я открываю файл, загруженный из Slack, он содержит много «?» и других символов, указывающих на плохую кодировку. Загрузка файла, а затем загрузка с помощью инструмента тестирования работает правильно и не привести к коррупции.

Наиболее важной частью является ajaxConfig; это объект, переданный методу jQuery ajax().

self.getClient().runReport({
    query: queryString,
    success: function(response){
        var formEnc = new FormData();
        formEnc.append('file', new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}), 'filename.xls');
        self.getClient().slackFile({
            filename: 'MyReport.xls',
            channel: '%23my-channel',
            ajaxConfig: {
                method: 'post',
                data: formEnc,
                processData: false,
                contentType: false,
                mimeType: 'multipart/form-data',
                success: function(response){
                    resolve(response);
                },
                error: function(response){
                    reject(response);
                }
            }
        });
    },
    error: function(msg){
        reject(msg);
    }
});

Я пробовал разные типы для Blob и mimeType безуспешно, хотя я не думаю, что это проблема, потому что отправляемый мной запрос POST выглядит так же, как и запрос, сгенерированный инструментом тестирования Slack (который загрузил файл без коррупции). Я подозреваю, что проблема должна быть в том, как я кодирую ответ, который я получаю от runReport (помните, что я могу загрузить этот файл вручную).


Обновление Я использовал FileSaver.js для загрузки ответа и файла поврежден таким же образом, поэтому это не связано с POST в Slack. Это должна быть кодировка.


person Allen    schedule 26.03.2017    source источник
comment
Я не эксперт по Javascript, но это похоже на проблему с кодировкой данных. Этот ответ может помочь: stackoverflow. ком/вопросы/19959072/   -  person Erik Kalkoken    schedule 26.03.2017


Ответы (1)


Это оказалось проблемой кодирования, вызванной jquery. Загрузка работает нормально при использовании прямого xhr.

var req = new XMLHttpRequest();
req.open(method, url);
req.responseType = 'arraybuffer';
req.onload = function(){
    success(req.response);
};
req.send();
person Allen    schedule 29.04.2017