axios下载文件(图片\压缩包等)

前情提要

需求:下载一些blob类型的文件类,如压缩包,图片,pdf等等。

下载图片,使用a.link的方式只会打开图片而不会下载,除非返回头中设置content-type,让浏览器知道是下载的资源。

本文介绍的是主动下载,url换成图片资源,不用设置content-type一样可以下载。

总结

axios({
  url: "",//接口
  method: 'GET',
  responseType: 'blob', //重要 
  headers:{
      'X-Token':store.getters.token,//有需要token的在这传
  },
  params:{
      //'album_id':this.currentId,//携带自定义数据
  }
}).then((response) => {
  console.log('res',response)
  if (response.data.type === 'application/json') {
      // 创建一个读取器来转换Blob为JSON
      const reader = new FileReader();
      reader.readAsText(response.data);
      reader.onload = () => {
          const jsonResponse = JSON.parse(reader.result);
          console.log('jsonResponse',jsonResponse)//自定义的错误或其他信息
          if (jsonResponse.status === 400) {
              // 处理自定义错误消息
              console.log('Custom Error Message:', jsonResponse.message);
              this.$message.warning(jsonResponse.message)   
          }
      };
  } else {
      //创建一个链接DOM节点
      const link = document.createElement('a');
      // 创建一个新的Blob对象
      const blob = new Blob([response.data]);
      // 创建blob链接
      link.href = window.URL.createObjectURL(blob);
      link.download = "活动相册.zip";//下载的文件名加后缀 可自定义
      // 隐藏DOM节点
      link.style.display = 'none';
      // 将链接节点添加到DOM中
      document.body.appendChild(link);
      // 模拟点击下载
      link.click();
      // 移除DOM节点
      document.body.removeChild(link);
  }
  
}).catch((error) => {
  console.error('下载文件时发生错误:', error.response);
});

细节

axios的配置

axios({
  url: "",//接口
  method: 'GET',
  responseType: 'blob', //重要 
  headers:{
      'X-Token':store.getters.token,//有需要token的在这传
  },
  params:{
      //'album_id':this.currentId,//携带自定义数据
  }
})
  • responseType //不写 默认配置json

正常接口返回json数据,axios会处理解析,在response.data中可以拿到

此处值为Blob,让axios接受blob类文件,如果不写,就算下载来,也会显示损坏。

then中设置

我的代码演示的是提交图片相册并下载压缩包,所以难免有报错一类的自定义错误,3xx、5xx等响应码可以在catch中获取,但是自定义的错误,比如传错Id等等,需要手动处理,但因为设置了responseType,不能通过普通方式获取本来的json格式数据。需要手动转换。

if (response.data.type === 'application/json') {
      // 创建一个读取器来转换Blob为JSON
      const reader = new FileReader();
      reader.readAsText(response.data);
      reader.onload = () => {
          const jsonResponse = JSON.parse(reader.result);
          console.log('jsonResponse',jsonResponse)//自定义的错误或其他信息
          if (jsonResponse.status === 400) {
              // 处理自定义错误消息
              console.log('Custom Error Message:', jsonResponse.message);
              this.$message.warning(jsonResponse.message)   
          }
      };
  }

代码演示的是自定义返回了对象数据中status==400,也有报错信息message。

这一段可以写在响应拦截器中,这里为了方便不作演示。

设置a标签下载

上面的流程都走完后,获取到正确的后端返回数据后,就要选择使用blob处理方式下载文件。

  //创建一个链接DOM节点
  const link = document.createElement('a');
  // 创建一个新的Blob对象
  const blob = new Blob([response.data]);
  // 创建blob链接
  link.href = window.URL.createObjectURL(blob);
  link.download = "活动相册.zip";//下载的文件名加后缀
  // 隐藏DOM节点
  link.style.display = 'none';
  // 将链接节点添加到DOM中
  document.body.appendChild(link);
  // 模拟点击下载
  link.click();
  // 移除DOM节点
  document.body.removeChild(link);

此处的link.download需要名字+类型后缀,可以让后端一起返回给你,自己组装,好自定义操作,没有的话手动指定。没有后缀会以txt格式下载并可能导致文件损坏。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值