是否可以通过FileSaver saveAs

时间:2015-11-11 09:18:54

标签: javascript jquery

我正在测试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); - 它显示文件内容。是否可以让我的代码下载文件?

2 个答案:

答案 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;
&#13;
&#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