Vue:后端返回二进制文件,前端如何实现浏览器自动下载?

Vue项目开发中,遇到界面下载功能时,前端如何实现将后端返回二进制文件在浏览器自动下载

一、关键代码:

javascript 复制代码
export function downloadFile(fileName) {
  axios({
    method: 'post',
    url: process.env.VUE_APP_BASE_API + '/cgi-bin/file',
    data: {
      'X-Token': getToken(),
      method: 'download',
      data: {
        filename: fileName
      }
    },
    responseType: 'blob'
  }).then((res) => {
    const blob = new Blob([res.data], { type: 'application/octet-stream;charset=utf-8' }); // 将二进制流转为blob
    const a = document.createElement('a');
    const url = window.URL.createObjectURL(blob); // 创建新的url并指向file对象或blob对象的地址
    a.href = url;
    a.download = fileName; // 设置下载文件名
    a.style.display = 'none'; //避免数据量过大,下载时间长,看到a标签
    document.body.appendChild(a);
    a.click();//关键;调用点击事件,(模拟a标签的点击下载效果)
    document.body.removeChild(a); // 下载完成移除元素
    window.URL.revokeObjectURL(url); // 释放内存
  });
}

二、实现逻辑:

首先,整个下载逻辑执行有以下几步:

  1. 前端发起请求拿到后端返回的二进制格式的数据;
  2. 将请求响应体中的二进制目标数据转行为blob类型的数据;
  3. 创建一个a标签,后续的自动下载的关键功能就是利用a.click()实现;
  4. 利用window.URL.createObjectURL(blob)方法,利用第二步转换的blob数据创建出一个url,并赋值给第三步创建的a标签的href属性;
  5. 利用document.body.appendChild(a)a标签添加到body标签中,后执行a.click()实现文件下载;
  6. 下载完成后,要移除a标签,使用代码document.body.removeChild(a)实现;
  7. 释放第四步创建的url地址内存;
  8. 整个下载流程结束。

三、代码解读:

  1. 如上图,封装了下载文件的函数,其中axios网络请求的编写根据你实际后端定的接口来写,主要目的就是拿到后端返回的二进制数据。其中fileName,是当前请求一个参数,同时也作为后续要用到的文件名。需要注意的是,请求的responseType:"blob"

  2. 二进制格式数据转行blob数据类型的代码;

javascript 复制代码
 const blob = new Blob([res.data], { type: 'application/octet-stream;charset=utf-8' }); // 将二进制流转为blob
  1. 创建a标签;创建url地址;给a标签href属性赋值url地址;执行点击操作;最后移除a标签 释放url内容。
javascript 复制代码
 const a = document.createElement('a');
 const url = window.URL.createObjectURL(blob); // 创建新的url并指向file对象或blob对象的地址
 a.href = url;
 a.download = fileName; // 设置下载文件名
 a.style.display = 'none'; //避免数据量过大,下载时间长,看到a标签
 document.body.appendChild(a);
 a.click(); //关键;调用点击事件,(模拟a标签的点击下载效果)
 document.body.removeChild(a); // 下载完成移除元素
 window.URL.revokeObjectURL(url); // 释放内存

四、相关文章:

1.下载后端返回的二进制文件

2.前端实现调用后台接口下载,arraybuffer和blob

3.前端通过axios请求下载excel文件

4.后端返回二进制文件流,前端处理下载

5.vue 后端返回二进制流文件,前端如何实现下载?

相关推荐
用户938515635071 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
CodeSheep1 小时前
稚晖君公司人事大变动,来了!
前端·后端·程序员
鱼樱前端2 小时前
用 AI 做内容变收入
前端·人工智能·ai编程
eric-sjq2 小时前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html
浮生望2 小时前
React + TypeScript 组件设计进阶:从类型约束到无状态组件的三次进化
前端
To_OC2 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
90后的晨仔2 小时前
Mac 开发 uni-app 终极方案:让安卓模拟器彻底脱离 Android Studio 独立运行
前端·vue.js
90后的晨仔2 小时前
别再搞混了!uni-app 中 node_modules 和 uni_modules 到底是什么关系?
前端
kyriewen3 小时前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试
谢小飞3 小时前
大文件上传很难?学会这招,GB文件秒传不是梦
前端·node.js