vue+axios实现文件下载

33 篇文章 1 订阅
2 篇文章 0 订阅

首先后端要返回的数据格式为文件流的形式

响应头为:

Content-Type:application/octet-stream

这是请求后端返回的信息:

 

前端axios请求:

// 下载模板
const exportAlterExcelTemplate = () => {
  return _ajax({
    url: '/admin/vocabulary_manager/export_alter_excel_template',
    responseType: 'blob',// 这个必须设置为blob,否则axios默认数据格式返回的为json
    isDownload: true // 这个是因为我在响应拦截器中配置了返回response.data,如果这个字段是true,就直接返回response,因为后端直接返回的一个文件流,这里就是一个blob对象
  })
}

页面调用api:

    async downloadTemplate () {
      const res = await exportAlterExcelTemplate()
      this.download(res)// 封装的下载方法,抽取到混入中,每个下载的地方就都能导入使用了
    }

下载方法:

export default {
  methods: {
    // 传入后端返回的res即可
    download (res) {
      // 获取文件的文件名
      const fileName = res.headers['content-disposition'].substring(
        res.headers['content-disposition'].indexOf('filename=') + 9,
        res.headers['content-disposition'].length
      )
      // 判断当前浏览器的a标签是否支持下载
      if ('download' in document.createElement('a')) {
        // 如果支持就创建a标签
        const downloadLink = document.createElement('a')
        // 为blob对象创建一个本地URL
        const url = window.URL.createObjectURL(res.data)
        // 将url赋值给其href属性
        downloadLink.href = url
        // 将文件名给到download属性
        downloadLink.setAttribute('download', fileName)
        // 将a标签添加到文档中
        document.body.appendChild(downloadLink)
        // 点击下载文件
        downloadLink.click()
        // 从文档中移除a标签
        document.body.removeChild(downloadLink)
      } else {
        // 如果浏览器不支持download属性,兼容ie
        window.navigator.msSaveBlob(res.data, fileName)
      }
    }
  }
}

这样就会自动弹出下载文件框让你保存啦~因为博主后端老板作死接口必须全部用post请求  所以很无语 只能这么绕个弯,不然get请求a标签就能直接下载,但是兼容不了ie,a标签下载的方法:

<a :href="get请求的url" download="您的文件名,可写可不写,不写就使用默认的文件名">下载实例</a>

一个链接就完事儿了,a标签自带下载功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值