vue实现文件流文件导出
场景:实现execl文件导出
前端工作:根据后台返回的文件流,导出execl文件
遇到的主要问题:1.出现跨域(注:这里后台其实已经实现所有接口可跨域,但是不知道为啥还是出现了跨域)2.生成的href地址未赋值到a标签上
整体解决思路:
a标签加href地址具备下载共功能。
所以这里出现第一个目标:根据文件流在本地实现下载地址。
主要用到了俩个知识点:
- new Blob(), 利用Blob构造函数,把返回的文件流转为blob对象
- 利用URL.createObjectURL(第一点生成的blob对象),生成本地url
具体代码
const blob = new Blob([res]); //res为后台返回的文件流,注意参数是以数组的形式上传
const href = URL.createObjectURL(blob); //URL都要大写,这点也要注意
const link = document.createElement("a") //生成a标签用于模拟下载
link.download = "test.xlsx"; //自定义下载文件名称
link.href = href //把生成的href赋值到a标签上,在这里我遇到一个问题,
//直接赋值无法把href赋值到a标签的href上(不知道是不是因为封装框架的问题)
//我采用了原生的方法
//link.setAttribute("href", href);
document.body.appendChild(link);
link.click();
//释放空间
document.body.removeChild("link");
URL.removeObjectURL(href);
注: 在请求后台接口时,在请求的接口中加入responseType: blob. 具体用法,responseType和headers同级。我这里还未弄清楚它的作用,希望万能的网友帮忙解释一下。
跨域问题最终通过vue代理进行解决,这里不再具体赘述。