我正在测试FileSaver saveAs功能。这是我使用帖子请求获取报告数据的代码
$.ajax({
type: "POST",
url: '/rest/report/test',
contentType: 'application/json',
async: false,
data: JSON.stringify({"date": "11.11.2015"}),
success: function (response) {
console.log(response);
saveAs(response,"test.xlsx");
}
});
失败并出现错误:未捕获TypeError:无法在'URL'上执行'createObjectURL':找不到与提供的签名匹配的函数。
但我可以看到result console.log(response); - 它显示文件内容。是否可以让我的代码下载文件?
答案 0 :(得分:2)
saveAs
尝试对您的文字执行createObjectURL
,然后失败。
原因是saveAs
不接受纯文本作为参数。它只接受Blob
个对象。
如果您的服务器返回文本,您可以使用Blob
构造函数从文本中创建new Blob()
。
以下是工作示例:
document.getElementById('download').onclick = function() {
var text = "Hello world!";
var blob = new Blob([text], {
type: "text/plain; encoding=UTF-8"
});
saveAs(blob, "result.txt");
};

<script src="http://eligrey.com/demos/FileSaver.js/FileSaver.js"></script>
<a href="#" id="download">Download</a>
&#13;
只要您有二进制文件,就可以使用原生XMLHttpRequest
并使用responseType = blob
。
var xhr = new XMLHttpRequest();
xhr.open('POST', '/rest/report/test/', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
var blob = this.response;
saveAs(blob, 'download.xlsx');
}
};
xhr.send();
答案 1 :(得分:1)
答案有点迟,但对其他程序员有用
jQuery不允许下载二进制文件,这就是这里所需要的。没有数据类型的调用可能默认为文本。从文本字符串创建blob可能会导致伪影损坏文件,因为二进制数据最初被解释为文本。
根据Yeldar的回答,您称自己为XMLHttpRequest,但这不允许您保持代码清洁。 jQuery允许创建Ajax传输插件,因此您可以通过在响应中直接调用saveAs来获取包含在blob中的二进制数组并绕过昂贵的转换。
http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
Github代码:https://github.com/henrya/js-jquery/tree/master/BinaryTransport