前端文件下载有两种方式:
1、通过文件流进行下载
2、通过url进行下载
一、通过文件流进行下载
后端返回的数据是blob格式的,在请求数据的时候应该加上responseType : ‘blob’,不然下载下来打开之后是乱码。对blob的数据进行处理,就可以进行文件下载,这里示例excel下载:
let filename = '文件名.xls';
let blob = new Blob([res])//res即为blob数据,请注意自己的数据形式
let url = window.URL.createObjectURL(blob,{type: 'application/vnd.ms-excel'});
const link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', filename);
document.documentElement.appendChild(link);
link.click();
document.documentElement.removeChild(link);
找了很久的问题,res的返回值为undefined,确认一下几种情况:
1、mockjs会对axios请求进行影响,会删除返回的blob数据,注意排除是否是这个问题,mockjs是模仿后端数据交互的一个东西。
2、找了很久,看见了对axios进行封装的时候,请求响应删除了blob的数据,所以需要做一个判断,如果类型是blob类型的数据,就应该返回,这样才有数据。
if(Object.prototype.toString.call(response.data) === "[object Blob]"){
return response.data
}
就这么个破问题,找了好久,甚至自己重新写了一个原生axios进行请求,妈的。
2、后端提供url前端进行下载:
window.location.href=url
调用直接下载接即可。