vue 配合后台实现 wd 文件导出功能
开始
在 vue
框架中,与传统的根据路径下载文件 document.getElementById("").src=''
方式不同,有时候,我们会需要将上传的文件在后台直接进行处理再回传到前端,这种情况下文件没有实际的可获取的路径,无法通过链接方式下载。但是可以通过将其转成blob对象,添加到 iframe
标签中来模拟下载(或者pdf预览)。具体的接收方式如下:
效果图
代码
新建 fileDownload.js
插入以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import axios from 'axios'
export function exportExcel(url,params) { return new Promise((resolve, reject) => { axios({ method: 'post', url: url, data: params, responseType: 'blob' }).then( response => { console.log(response); resolve(response.data) let blob = new Blob([response.data], { type: 'application/vnd.ms-excel' }) let fileName = response.headers['content-disposition'].split(";")[1].split("filename=")[1]; fileName = decodeURI(fileName); if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, fileName) } else { var link = document.createElement('a') link.href = window.URL.createObjectURL(blob) link.download = fileName link.click() window.URL.revokeObjectURL(link.href) } }, err => { reject(err) } ) }) }
|
在需要的组件中引用上面的 fileDownload.js
1
| import { exportExcel } from '@/utils/fileDownload';
|
调用
1 2 3 4 5 6
| <el-button type="success" size ="mini" icon="el-icon-download" @click='onDownload()'>导出 </el-button>
|
1 2 3 4 5 6
| onDownload(){ let url = '/roof/api/driving/queryDataExcel' let params = {} exportExcel(url, params) }
|
问题笔记
vue axios 设置 responseType: 'blob'
无效
mock
模块会影响原生的ajax
请求,使得服务器返回的blob
类型变成乱码
去除 mock 后
后台通过响应头返回的文件名导致前台获取导致乱码
F12
查看响应头没问题
但是 console.log()
打印后却出现乱码
最终无解,只能另辟蹊径
让后端使用 URLEncoder.encode(fileName, "UTF8")
对文件名进行编码处理!!一堆百分号那种东西!!直接返回给前端
前端则使用 decodeURI(fileName)
进行解码,效果图看 gif
1 2 3
| let fileName = response.headers['content-disposition'].split(";")[1].split("filename=")[1]; fileName = decodeURI(fileName);
|
总结完毕!