JavaScript 接收excel文件流并下载

条件:后端接口请求返回文件流,前端处理文件流转换成下载地址并下载
实现方法有二,一通过Blob对象和createObjectURL方法生成一个地址,二通过FileReader转成base64

方法一

1、axios请求携带参数responseType: 'arraybuffer', //二进制流

axios({
    responseType: 'arraybuffer', //二进制流
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    }
 })

2、处理文件流并下载

res是请求结果,res.data是文件流,res.headers是请求响应头

const headers = res.headers
let a = document.createElement("a");
// 响应头获取编码的文件名称
let filename = decodeURI(headers["content-disposition"].split(";")[1].split("=")[1])
try {
    //该实例化的方式第一个参数必须是数组的格式
    var blob = new Blob([res.data], { type: 'application/vnd.ms-excel,charset=utf-8' });
} catch (e) {
    //旧版本浏览器下的blob创建对象
    window.BlobBuilder = window.BlobBuilder ||
        window.WebKitBlobBuilder ||
        window.MozBlobBuilder ||
        window.MSBlobBuilder;
    if (e.name == 'TypeError' && window.BlobBuilder) {
        var blobbuilder = new BlobBuilder();
        BlobBuilder.append(data);
        var blob = blobbuilder.getBlob('application/vnd.ms-excel,charset=utf-8');
    } else {
        alert("浏览器版本较低,暂不支持该文件类型下载");
    }
}
let url = window.URL.createObjectURL(blob);

a.setAttribute("href", url)
a.download = filename
document.body.appendChild(a);
a.click()
document.body.removeChild(a);

方法二

1、axios携带参数 responseType: "blob"

axios({
    responseType: "blob", //blob流
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    }
 })

2、处理文件流并下载

let blob = res.data;
const reader = new FileReader();

reader.readAsDataURL(blob); // 转换为base64,可以直接放入a标签href

reader.onload = e => {
    // 转换完成,创建一个a标签用于下载

    let a = document.createElement("a");
    a.style.display = "none";
    a.download = "data.xls";

    a.href = e.target.result;
    const body = document.body;
    document.body.appendChild(a); // 修复firefox中无法触发click
    a.click();
    document.body.removeChild(a);
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 书名:《我从不感谢伤害过我的人》 作者:王小毛 今天为朋友们分享王小毛的作品:《我从不感谢伤害过我的人》 乍一看,...
    纸上蜗牛阅读 2,829评论 0 1
  • 01一年一度的体检,原先指标旁边无箭头,体检报告下面寥寥几字的年纪已过。临界高血压成了我的一大困扰,血小板献不成;...
    晓舟YY阅读 219评论 0 0
  • 以前总喜欢追剧,而且很喜欢韩剧,动情处自己也随景入情,哭的稀里哗啦是常有之事。一整天不吃不喝,一口气追完也有过记录...
    神呼吸阅读 346评论 0 0
  • 摘抄于《最好的老师不教书》 最伟大的教育工作者是观世音菩萨,永远微笑着,从不说一句废话,只用瓶子里中的净水灌溉,不...
    小智哒哒阅读 310评论 0 0

友情链接更多精彩内容