这里使用axios
请求接口,其他工具同理
axios({
url: 'xxxxx'
methods: 'get', // get请求获取文件流
params: {},
responseType: 'blob', // 注意这里必须规定响应类型,否则接口返回乱码
})
成功调用接口,接口返回blob
类型的二进制对象
导出文件or下载文件
const res = await xxxApi(); //请求api获取数据,res为Blob对象
const blobUrl = window.URL.createObjectURL(res);
let a = document.createElement('a');
a.style.display = 'none';
a.download = 'XXX文件名称';
a.href = blobUrl;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(blobUrl); // 只要映射存在,Blob就不能进行垃圾回收,因此一旦不再需要引用,就必须撤销URL,释放掉blob对象 或者 使用 blobUrl = null
注意:若设置responseType
为arraybuffer
,则调用接口返回的数据为ArrayBuffer
原始二进制类型
直接使用上面的方法会报错
这里需要将ArrayBuffer
类型转化为Blob
类型
const res = await xxxApi(); //请求api获取数据,res为ArrayBuffer对象
const blob = new Blob([res], { type: "application/vnd.ms-excel" }); // 注意!!! 这里需要将ArrayBuffer类型转化为Blob类型,需要指定type文件类型,否则默认为txt类型
const blobUrl = window.URL.createObjectURL(res);
let a = document.createElement('a');
a.style.display = 'none';
a.download = 'XXX文件名称';
a.href = blobUrl;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(blobUrl); // 只要映射存在,Blob就不能进行垃圾回收,因此一旦不再需要引用,就必须撤销URL,释放掉blob对象 或者 使用 blobUrl = null
建议直接使用blob
,因为使用arrayBuffer
的话需要转为Blob
类型,而且需要指定文件类型,在不知道文件类型的情况下,其默认为txt
,容易出错。
最终效果如下: