项目中常常会遇到须要导出列表内容,或者下载文件之类的需求。结合各类状况,我总结了前端最经常使用的三种方法来接受后端传过来的文件流并下载,针对不一样的状况可使用不一样的方法。前端
针对后端的get
请求ios
直接用个<a>
标签来接受后端的文件流json
<a href="后端文件下载接口地址" >下载文件</a>
针对后端的post
请求
利用原生的XMLHttpRequest
方法实现axios
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类型,能够直接使用方法一,简单又便捷;固然若是想使用方法2、三也是能够的,不过感受有点舍近求远了。
若是后端提供的下载接口是post类型,就必需要用方法二或者方法三了。
方法二和方法三怎么取舍?
当你的项目里的接口请求全是基于XMLHttpRequest实现的,这时方法二就更加适合,只要基于你原来项目中的接口请求工具类加以扩展就好了。
当你的项目里的接口请求全是基于fetch实现的,这时方法三就更加适合,好比我如今的作的一个项目就是基于ant design pro的后台管理系统,它里面的请求类就是基于fetch的,因此我就直接用的方法三,只要在它的request.js文件中稍做修改就行。
我这里讨论的是两种原生的请求方式,若是你项目中引用了第三方请求包来发送请求,好比axios之类的,那就要另当别论了。
api
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'}这行代码,这样返回给咱们的就不是乱码了。
---------------------
原文:https://blog.csdn.net/qq_34733308/article/details/84135648
app