vue-以文件流-blob-的形式-下载-导出文件操作
vue项目中,经常遇到文件导出与下载,有时候是直接返回服务端的文件url,这样直接以a链接下载,或者windown.open对不同类型的文件进行下载或预览。但如果返回的是文件流,则需要做一些其他处理,具体形式如下:
1、首先要确定服务器返回的数据类型。
在请求头中加入:config.responseType='blob'
有时候,不是所有接口都需要该类型,则可以对接口做一个判定:
//request拦截器 service.interceptors.request.use( config=>{//根据接口判定 if(config.url==='/setting/exportData'|| config.url.indexOf('export')>-1|| config.url.indexOf('Export')>-1){ config.responseType='blob'//服务请求类型 } if(getToken()){ config.headers['access_token']=getToken() } returnconfig }, error=>{ //Dosomethingwithrequesterror //console.log(error)//fordebug Promise.reject(error) } )
2、接口请求获取后端返回的文件流
//导出 onExport(){ if(this.dataList===''){ this.$message({ type:'error', message:'暂无数据导出' }) return } constfd=newFormData() fd.append('id',this.id) varexportFileName='导出文件名'//设置导出的文件名,可以拼接一个随机值 exportData(fd) .then(res=>{ //res.data是后端返回的文件流 //调用downloadUrl处理文件 downloadUrl(res.data,exportFileName) }) .catch(err=>{ this.$message({ type:'error', message:err.message }) }) },
3、文件处理downloadUrl--该方法可以写为公共方法以便调用
//使用iframe框架下载文件--以excel为例,可修改type与fileName选择文件类型 exportfunctiondownloadUrl(res,name){ constblob=newBlob([res],{type:'application/vnd.ms-excel'})//构造一个blob对象来处理数据 constfileName=name+'.xlsx'//导出文件名 constelink=document.createElement('a')//创建a标签 elink.download=fileName//a标签添加属性 elink.style.display='none' elink.href=URL.createObjectURL(blob) document.body.appendChild(elink) elink.click()//执行下载 URL.revokeObjectURL(elink.href)//释放URL对象 document.body.removeChild(elink)//释放标签 }
4、在ie浏览器中存在兼容性问题,对downloadUrl做一些调整
//使用iframe框架下载文件-兼容性考虑 exportfunctiondownloadUrl(res,name){ constblob=newBlob([res],{type:'application/vnd.ms-excel'}) //forIE if(window.navigator&&window.navigator.msSaveOrOpenBlob){ constfileName=name+'.xlsx' window.navigator.msSaveOrOpenBlob(blob,fileName) }else{ //forNon-IE(chrome,firefoxetc.) constfileName=name+'.xlsx' constelink=document.createElement('a') elink.download=fileName elink.style.display='none' elink.href=URL.createObjectURL(blob) document.body.appendChild(elink) elink.click() URL.revokeObjectURL(elink.href) document.body.removeChild(elink) } }
总结:至此,以文件流的形式导出文件的一种方式便已经实现。
补充知识:vue中使用文件流进行下载(newBlob),不打开一个新页面下载
我就废话不多说了,大家还是直接看代码吧~
exportfunctiondownload(url,params,filename){ Message.warning('导出数据中') returnaxios.get(url,{ params:params, responseType:'arraybuffer', }).then((r)=>{ constcontent=r.data constblob=newBlob([content],{type:'application/vnd.ms-excel'}) if('download'indocument.createElement('a')){ constelink=document.createElement('a') elink.download=filename elink.style.display='none' elink.href=URL.createObjectURL(blob) document.body.appendChild(elink) elink.click() URL.revokeObjectURL(elink.href) document.body.removeChild(elink) Message.success('导出成功') } }).catch((r)=>{ console.error(r) Message.error('导出失败') }) }
以上这篇vue-以文件流-blob-的形式-下载-导出文件操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。