赞
踩
this.$axios({
url:"*****",// 具体地址根据后端提供的来
reponseType:"blob",// 表明返回服务器返回的数据类型(关键:要写)
method:"GET",// 请求方法不一定(可能是get也可能是post,根据后端具体情况)
params:{参数名:参数值,参数名:参数值},
headers:{"Content-Type":"application/json"},
}).then(res => {
fileDownload('',1,res)// 该方法就是以下的封装方法
})
/** 文件下载方法 *@param fileName 文件名 *@param type 文件类型 *@param result 文件流(故后端返回的bolb类型文件流) **/ const fileDownload = function(fileName,type,result) { // 如果没返回数据,就return出去 if(!result){ return } switch(type){ case 1: fileName += ".docx" break; case 2: fileName += ".xlsx" break; case 3: fileName += ".pdf" break; case 4: fileName += ".zip" break; case 5: fileName += ".doc" break; case 6: fileName += ".xls" break; default: break; } /-----------------以下所有步骤可以直接写在.then方法里,封装只是为了提高复用性------------/ // 创建url let url = window.URL.createObjectURl(new Blob([result.data])) // 创建a标签 let link = document.createElement("a") // 隐藏a标签(防止渲染在页面,因为在这个地方创建a标签只是为了调用a标签下载功能) link.style.display = "none" // a标签herf对应url link.href = url // 若后端返回了文件名,就用后端返回的文件名(若加密返回需解码) 注:此处也可以不用后端返回文件名,也可以前端直接写死,根据场景不同,灵活应对 let contentDispositon = result.headers["content-disposition"] // 后端返回文件不一定都放在这 if(contentDispositon) { fileName = decodeURLComponent(contentDispositon.split("=")[1])// split这里的切割,根据后端返回文件名的数据不同,自由切割,不固定 } // 调用下载方法 link.download = fileName // a标签添加页面中 document.body.appendChild(link) // 调用a标签点击事件,触发a标签 link.click() //操作完毕后,移除a标签 link.remove() }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。