赞
踩
项目中经常会遇到需要导出列表内容,或者下载文件之类的需求。结合各种情况,我总结了前端最常用的三种方法来接受后端传过来的文件流并下载,针对不同的情况可以使用不同的方法。
针对后端的get
请求
<a href="后端文件下载接口地址" >下载文件</a>
直接用个<a>
标签来接受后端的文件流
针对后端的post
请求
利用原生的XMLHttpRequest
方法实现
- function request () {
- const req = new XMLHttpRequest();
- req.open('POST', '<接口地址>', true);
- req.responseType = 'blob';
- req.setRequestHeader('Content-Type', 'application/json');
- req.onload = function() {
- const data = req.response;
- const a = document.createElement('a');
- const blob = new Blob([data]);
- const blobUrl = window.URL.createObjectURL(blob);
- download(blobUrl) ;
- };
- req.send('<请求参数:json字符串>');
- };
-
- function download(blobUrl) {
- const a = document.createElement('a');
- a.style.display = 'none';
- a.download = '<文件名>';
- a.href = blobUrl;
- a.click();
- document.body.removeChild(a);
- }
-
- request();
针对后端的post
请求
利用原生的fetch
方法实现
- function request() {
- fetch('<接口地址>', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: '<请求参数:json字符串>',
- })
- .then(res => res.blob())
- .then(data => {
- let blobUrl = window.URL.createObjectURL(data);
- download(blobUrl);
- });
- }
-
- function download(blobUrl) {
- const a = document.createElement('a');
- a.style.display = 'none';
- a.download = '<文件名>';
- a.href = blobUrl;
- a.click();
- document.body.removeChild(a);
- }
-
- request();
get
类型,可以直接使用方法一,简单又便捷;当然如果想使用方法二、三也是可以的,不过感觉有点舍近求远了。post
类型,就必须要用方法二或者方法三了。XMLHttpRequest
实现的,这时方法二就更加适合,只要基于你原来项目中的接口请求工具类加以扩展就行了。fetch
实现的,这时方法三就更加适合,比如我现在的做的一个项目就是基于ant design pro
的后台管理系统,它里面的请求类就是基于fetch
的,所以我就直接用的方法三,只要在它的request.js
文件中稍作修改就行。
this.$axios.post("/api/xxx/xxx/xxx",this.$qs.stringify({range:0,}),{responseType:'blob'}).then(msg=>{
console.log(msg.data) //打印出来是blob对象,已经不是乱码了
let url = window.URL.createObjectURL(msg.data); //表示一个指定的file对象或Blob对象
console.log(url,"看一下这是啥")
let a = document.createElement("a");
document.body.appendChild(a);
let fileName=msg.headers["content-disposition"].split(";")[1].split("=")[1]; //filename名称截取
a.href = url;
a.download = fileName; //命名下载名称
a.click(); //点击触发下载
window.URL.revokeObjectURL(url); //下载完成进行释放
})
特别注意:
在和后台交互的时候,如果后台返回给我们的是二进制流数据,我们就要在发送的时候加上{responseType:'blob'}这行代码,这样返回给我们的就不是乱码了。
---------------------
作者:noResults
来源:CSDN
原文:https://blog.csdn.net/qq_34733308/article/details/84135648
版权声明:本文为博主原创文章,转载请附上博文链接!
作者:嘴里起了个泡
链接:https://www.jianshu.com/p/8ef2c7b8b46c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。