前言
有一种业务需求,运营需要通过前端的查询条件,从后端数据库导出大量数据,假设要导出一个30万条以上数据的Excel文件,而这些数据是随时变动的,每次都需要最新的数据,我们称这种为“现倒”(现场导出),应该怎么做?
肯定有小伙伴说了,这还不简单,请求接口传递筛选项,让后端返回一个文件地址,前端一个A标签download不就完了?
如果后端运行在docker容器中,为安全考虑不提供无权限的公共文件夹路径,而且不能让运营等太久,上传oss再给链接?先不考虑数据时效性,运营也等不了这么久。
这时的你应该怎么做?
后端返回二维数组由前端导出?
数据小的时候这没问题,30万?100万?你猜会是后端卡住,还是数据库卡住?
正确做法
由后端返回二进制流文件,前端创建临时链接,由A标签download
这里注意responseType要为blob
响应头中的文件名bug
文件名用中文会出现乱码
最好用Base64传递,前端使用Base64解码
js 原生的API atob 与 btoa不能解析中文
下面是两种解码方式