首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用blob从ajax结果下载文件

使用blob从ajax结果下载文件
EN

Stack Overflow用户
提问于 2015-04-01 22:33:20
回答 1查看 58.2K关注 0票数 24

我用这段代码从服务器上下载excel文件。

代码语言:javascript
运行
复制
$.ajax({
    headers: CLIENT.authorize(),
    url: '/server/url',
    type: 'POST',
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(jsonData),
    success: function (data) {
        alert('Data size: ' + data.length);
        var blob = new Blob([data], { type: "application/vnd.ms-excel" });
        alert('BLOB SIZE: ' + data.length);
        var URL = window.URL || window.webkitURL;
        var downloadUrl = URL.createObjectURL(blob);
        document.location = downloadUrl;
    },
});

我遇到的问题是,即使数据和blob大小是相同的,但一旦分配到document.location,我就会被提示下载几乎大两倍的excel文件。当我试图打开它时,excel抱怨文件格式错误,打开的文件包含很多垃圾,尽管所需的文本仍然在那里。

你知道是什么导致了这种情况,以及如何避免吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-10 16:11:25

所以我用AJAX 2解决了这个问题,它本身就支持二进制流。显然,除非您对所有内容都进行base64编码,否则不能使用jQuery。

工作代码如下所示:

代码语言:javascript
运行
复制
var xhr = new XMLHttpRequest();
xhr.open('POST', '/le/url', true);
xhr.responseType = 'blob';
$.each(SERVER.authorization(), function(k, v) {
    xhr.setRequestHeader(k, v);
});
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
xhr.onload = function(e) {
    preloader.modal('hide');
    if (this.status == 200) {
        var blob = new Blob([this.response], {type: 'application/vnd.ms-excel'});
        var downloadUrl = URL.createObjectURL(blob);
        var a = document.createElement("a");
        a.href = downloadUrl;
        a.download = "data.xls";
        document.body.appendChild(a);
        a.click();
    } else {
        alert('Unable to download excel.')
    }
};
xhr.send(JSON.stringify(jsonData));

希望这能有所帮助。

票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29393601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档