后端接口返回二进制数据流,前端如何将其转换成对应的excel、csv和json文件格式并下载

本文主要是介绍在工作中遇到的后端接口返回一个二进制数据流,前端在界面上创建下载按钮并下载成对应格式的文件导出。

java 复制代码
downloadData({
	start: startTime,
	end: endTime,
	exportType: 0, // 0-excel, 1-csv, 2-json
}).then((res) => {
	download(res, startTime, endTime, exportType);
})

接口会返回一个二进制数据流,如下图所示。

startTimeendTime 是用来构建文件名字,exportType 是用来确定导出文件格式后缀的。

根据对应的按钮获取对应文件,并由浏览器进行下载。

java 复制代码
const download = (res: any, startDate: any, endDate: any, exportType: any) => {
    const blob = new Blob([res])
    let filename = "";
    let startPrefix = new Date(startDate);
    let endPrefix = new Date(endDate);
    // 起名
    let date = startPrefix.getFullYear().toString() + 
    	(startPrefix.getMonth() + 1 < 10 ? '0' + 
    	(startPrefix.getMonth() + 1) : startPrefix.getMonth() + 1) +
        startPrefix.getDate().toString() + '-' + 
        endPrefix.getFullYear().toString() + 
        (endPrefix.getMonth() + 1 < 10 ? 
        '0' + (endPrefix.getMonth() + 1) : 
        endPrefix.getMonth() + 1) + endPrefix.getDate().toString();

	// 判断后缀
    if (exportType=== 0) filename = date + '.json';
    else if (exportType === 1) filename = date + '.xlsx';
    else filename = date + '.csv';

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        window.navigator.msSaveBlob(blob, filename);
    } else {
    	// 导出
        const url: any = window.URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.style.display = 'none';
        link.href = url;
        link.setAttribute('download', filename);
        document.body.appendChild(link);
        link.click();
        URL.revokeObjectURL(url.href);
        document.body.removeChild(link);
    }
}

导出主要是通过创建一个 url 并自行下载。

相关推荐
ZC跨境爬虫11 分钟前
跟着 MDN 学 HTML day_36:(深入理解 Comment 接口与 DOM 注释节点)
前端·javascript·ui·html·音视频·视频编解码
石小石Orz30 分钟前
Harness Engineering 到底是什么?概念、实战与争议,一次全部讲清楚
前端·后端
悠哉摸鱼大王35 分钟前
cesium学习(三)-3d tiles
前端·cesium
前端那点事36 分钟前
Vue3自定义Hooks保姆级教程!从原理到企业级实战,告别混乱代码
前端·vue.js
前端那点事37 分钟前
别再乱用Vue3响应式!ref、reactive、toRef、toRefs完整区别+企业级落地实战
前端·vue.js
yingyima38 分钟前
Base64 编码解码实战:业务场景下的高效应用
前端
悠哉摸鱼大王41 分钟前
cesium学习(五)-Primitive
前端·cesium
悟空瞎说43 分钟前
Git Worktree 实战:多 AI 编码代理并行开发,彻底解决分支切换冲突痛点
前端·git
悠哉摸鱼大王43 分钟前
cesium学习(四)-相机
前端·cesium
zeqinjie1 小时前
Skills-Flutter 内测泄漏审核
前端·flutter·app