最近在开发中遇到一个的问题,页面中有一个导出excel的接口
但由于后端需要前端请求的时候携带复杂的数据,所以导致不能使用form表单或者get的方式去请求。
就像这样 `parms`还封装了一层
如果不需要向后端发送数据或数据不多的情况下使用 Form表单 的提交或者 Get 的方式去请求下载。
但是由于AJAX并不会唤起浏览器的下载窗口,AJAX设计的初衷就是用来实现异步刷新的,用以改善原始的form表单提交刷新页面的问题。所以决定利用 Blob 对象来接收处理,在接收到后端返回的流文件后,把其转化一下,放入a标签的href中。并触发下载行为。
this.fetchExportExcel(parms).then(res => {
const content = res.data
const blob = new Blob([content], { type: 'application/vnd.ms-excel' })
if ('download' in document.createElement('a')) {
const link = document.createElement('a')
link.download = '1.xls'
link.style.display = 'none'
link.href = URL.createObjectURL(blob)
document.body.appendChild(link)
link.click()
URL.revokeObjectURL(link.href)
document.body.removeChild(link)
} else {
navigator.msSaveBlob(blob)
}
})
但是下载下来的excel总是乱码,于是一顿折腾,设置请求头,响应头。百度,Google 云云
最终还是乱码
最后经过大佬提醒发现 项目是 Vue + axios 采用了Mock.js 导致乱码
使用此方法需要禁止 Mock.js才能防止乱码