我正在使用Slack的 files.upload API来上传从AJAX响应中检索到的Excel文档。我正在使用jQuery的AJAX进行上传,文件正确上传,但它已损坏。当我打开从Slack下载的文件时,它包含许多“?”和其他表示编码错误的字符。下载文件,然后使用Slack的tester tool上传,工作正常,不会导致损坏。
最相关的部分是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下载响应并且文件以相同的方式被破坏,因此它与Slack的POST无关。它必须是编码。
答案 0 :(得分:1)
它最终成为由jquery引起的编码问题。使用直接xhr时,上传工作正常。
var req = new XMLHttpRequest();
req.open(method, url);
req.responseType = 'arraybuffer';
req.onload = function(){
success(req.response);
};
req.send();