后端接口返回文件流,前端处理并下载

如图:前端请求导出接口,后端返回的像是一堆乱码,其实这是文件流,需要前端处理一下才能下载

在这里插入图片描述

写一个公共的方法,在utils文件夹下新建一个validate.js文件

import { Message } from 'element-ui'
import service from '@/utils/request' //service是创建的axios实例

// 下载文件流
export function downRequest(url, params, fileName) {
  return service.post(url, params, {
  // 因为是post请求,处理传参格式为formdata
    transformRequest: [(params) => {
      let result = ''
      Object.keys(params).forEach((key) => {
        if (!Object.is(params[key], undefined) && !Object.is(params[key], null)) {
          result += encodeURIComponent(key) + '=' + encodeURIComponent(params[key]) + '&'
        }
      })
      return result
    }],
    responseType: 'blob' //非常重要
  }).then((res) => {
    // console.log('res', res) 
    //注意这里有可能是res.data, 根据你们的接口返回来看,最好打印一下看看,如果没有拿到返回的数据,导出的表格打开会出现undefined
    const blob = new Blob([res]) // 转化为blob对象
    const filename = fileName || 'filename.xlsx' // 判断是否使用默认文件名
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
      window.navigator.msSaveBlob(blob, filename)
    } else {
      var blobURL = window.URL.createObjectURL(blob) // 将blob对象转为一个URL
      var tempLink = document.createElement('a') // 创建一个a标签
      tempLink.setAttribute('download', fileName + '.xlsx') // 下载的文件名以及文件格式
      tempLink.style.display = 'none'
      tempLink.href = blobURL
      tempLink.setAttribute('download', filename) // 给a标签添加下载属性
      if (typeof tempLink.download === 'undefined') {
        tempLink.setAttribute('target', '_blank')
      }
      document.body.appendChild(tempLink) // 将a标签添加到body当中
      tempLink.click() // 启动下载
      document.body.removeChild(tempLink) // 下载完毕删除a标签
      window.URL.revokeObjectURL(blobURL)
      Message.success('导出成功')
    }
  }).catch((r) => {
    console.error(r)
    Message.error('下载失败')
  })
}

在页面调用

import { downRequest } from '@/utils/validate'


downRequest('url接口', { id: id }, '数据导出.xlsx')
         //('url接口', {'后端需要的参数'}, '自定义格名称.xlsx')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值