AJAX发起POST请求下载excel文件

7,318 阅读1分钟

最近在开发中遇到一个的问题,页面中有一个导出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才能防止乱码