1 post方法请求后端blob数据

let expUrl = encodeURI(urls.getList)
let params = {
          type: 0,
          keyword: this.search.keyword ? this.search.keyword : '',
        }
this.$http
  .post(expUrl, params, {
    headers: { 'Content-Type': 'application/json' },
    responseType: 'blob',
    withCredentials: true,
  })
  .then(res => {
    if (res) {
      saveAs(res, '导出文件名称.xlsx') // 插件方式
      // this.readBlobDown(res, '导出文件名称.xlsx') // 使用函数
    }
  })
  .catch(err => {
    this.$tips.tipWarning('导出异常,请稍后重试')
    return Promise.reject(err)
  })

注意post请求时,配置文件中含有参数responseType: ‘blob’,添加此配置,则会将请求成功后的数据,封装成Blob类型,便于响应拦截器中获取此类型的数据并做一些特殊处理,如下(相当于是加了一个标签;据测试,只要请求的接口中,添加了responseType: ‘blob’,则返回的类型都会被封装成Blob类型,这个类型相当于是前端添加的一个标签,是为了方便后续处理;前端通过和后端约定,使用Blob这种类型请求,此时后端返回文件流,实现某种结果):

{
    headers: { 'Content-Type': 'application/json' },
    responseType: 'blob',
    withCredentials: true,
} 

且此时响应拦截器中要添加拦截:

if (response.data instanceof Blob) {
    return response.data
}

在这里插入图片描述
若post请求的then里面得到的blob流为空,注意排查是否是中间进行了数据处理
请求得到的blob流正常如下所示(我们真正转换为文件时需要使用到的是返回的类型为Blob的data):
在这里插入图片描述

2 前端将Blob流文件转为文件导出

有两种方式

2.1 函数方式

/**
 * 读取下载的文件流
 */
readBlobDown(result, filename) {
  var blob = result // ie 使用
  if (window.navigator.msSaveBlob) {
    // for ie 10 and later
    try {
      var blobObject = new Blob([blob], { type: 'application/vnd.ms-excel' }) // 构造一个blob对象来处理数据
      window.navigator.msSaveBlob(blobObject, filename)
    } catch (e) {
      console.log(e)
    }
  } else {
    // 其他浏览器 下载方式
    var reader = new FileReader()
    reader.readAsDataURL(blob)
    reader.onload = function(e) {
      // 转换完成,创建一个a标签用于下载
      var a = document.createElement('a')
      a.download = filename // 设置下载的文件名称
      a.href = e.target.result
      // 兼容触发click
      var evt = document.createEvent('MouseEvents')
      evt.initEvent('click', true, true)
      a.dispatchEvent(evt)
    }
  }
},

使用:

 this.readBlobDown(resBlob, '导出文件名称.xlsx') // 使用函数

2.2 使用file-saver插件

前期准备:
1.安装插件:npm install --save file-saver
2.在需要导出的文件下引入:import { saveAs } from 'file-saver'
使用:
直接 saveAs(res, '导出文件名称.xlsx')

this.$http.
    .post(expUrl, params, {
      headers: { 'Content-Type': 'application/json' },
      responseType: 'blob',
      withCredentials: true,
    })
    .then(res => {
       if (res) {
          saveAs(res, '导出文件名称.xlsx') // 插件方式
          // this.readBlobDown(res, '导出文件名称.xlsx') // 使用函数
       }
    })
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐