vue.js 使用axios实现下载功能

本文主要来源于知乎一个回答,这里红色部分做了自己的处理,虽然自己的少,可是很有用的几句代码哦

只好回答一下axios如何拦截get请求并下载文件的了。

Ajax无法下载文件的原因

浏览器的GET(frame、a)和POST(form)请求具有如下特点:

  • response会交由浏览器处理
  • response内容可以为二进制文件、字符串等

Ajax请求具有如下特点:

  • response会交由Javascript处理
  • response内容仅可以为字符串

因此,Ajax本身无法触发浏览器的下载功能。

Axios拦截请求并实现下载

为了下载文件,我们通常会采用以下步骤:

  • 发送请求
  • 获得response
  • 通过response判断返回是否为文件
  • 如果是文件则在页面中插入frame
  • 利用frame实现浏览器的get下载

我们可以为axios添加一个拦截器:

 

import axios from 'axios'

// download url
const downloadUrl = url => {
  let iframe = document.createElement('iframe')
  iframe.style.display = 'none'
  iframe.src = url
  iframe.onload = function () {
    document.body.removeChild(iframe)
  }
  document.body.appendChild(iframe)
}

// Add a response interceptor
axios.interceptors.response.use(c=> {
  // 处理excel文件
  if (res.headers && (res.headers['content-type'] === 'application/x-msdownload' || res.headers['content-type'] === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) {
    downloadUrl(res.request.responseURL)
    
    res.data='';
    res.headers['content-type'] = 'text/json'
    return res;
  }
  ...
  return res;
}, error => {
  // Do something with response error
  return Promise.reject(error.response.data || error.message)
})
export default axios res.data='';
    res.headers['content-type'] = 'text/json'
    return res;
  }
  ...
  return res;
}, error => {
  // Do something with response error
  return Promise.reject(error.response.data || error.message)
})
export default axios

 

 

 

之后我们就可以通过axios中的get请求下载文件了。

 

 

 

结束

主要代码来自:https://www.zhihu.com/question/263323250/answer/267842980

 

另一种方法

由于兼容性等问题,其实导出直接用链接更方便一些,兼容性也好,参数不是很多的话放在请求路径后面也是ok的,具体如下:

 //导出
    exportOrderList() {
      this.formItem.token = Cookies.get('token');
      let param = "";
      for(let field in this.formItem) {
        if(this.formItem[field]) {
          param += field + "=" + this.formItem[field] + "&";
        }
      }
      param = param.substring(0, param.length-1);
      let url = "api/queryListExport?" + param;
      window.location.href = url;
    },

关键就是这句哦:

window.location.href = url;

这样也不需要像上面加拦截器什么的了哦,方便好用

关注公众号获取更多内容,有问题也可在公众号提问哦:

 

强哥叨逼叨

叨逼叨编程、互联网的见解和新鲜事

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值