Vue如何实现将后端返回二进制文件在浏览器自动下载

 更新时间:2024年11月22日 11:45:28   作者:前端白袍  
Vue项目开发中,遇到界面下载功能时,前端如何实现将后端返回二进制文件在浏览器自动下载呢,本文就来和大家聊聊具体的解决方法吧

一、关键代码

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.整个下载流程结束。

三、代码解读

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

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

 const blob = new Blob([res.data], { type: 'application/octet-stream;charset=utf-8' }); // 将二进制流转为blob

创建a标签;创建url地址;给a标签href属性赋值url地址;执行点击操作;最后移除a标签 释放url内容。

 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); // 释放内存

以上就是Vue如何实现将后端返回二进制文件在浏览器自动下载的详细内容,更多关于Vue浏览器自动下载的资料请关注脚本之家其它相关文章!

相关文章

  • Vue中判断语句与循环语句基础用法及v-if和v-for的注意事项详解

    Vue中判断语句与循环语句基础用法及v-if和v-for的注意事项详解

    在Vue指令中,最经常被用于做逻辑操作的指令,下面这篇文章主要给大家介绍了关于Vue中判断语句与循环语句基础用法及v-if和v-for注意事项的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Vue实现模糊查询的简单示例

    Vue实现模糊查询的简单示例

    在Vue中实现模糊查询,你可以使用JavaScript的filter和includes方法,结合Vue的v-for指令,本文给大家举了一个简单的示例,并通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • vue awesome swiper异步加载数据出现的bug问题

    vue awesome swiper异步加载数据出现的bug问题

    这篇文章主要介绍了vue awesome swiper异步加载数据出现的bug问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • vue组件style中scoped的作用及说明

    vue组件style中scoped的作用及说明

    这篇文章主要介绍了vue组件style中scoped的作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • vue element upload组件 file-list的动态绑定实现

    vue element upload组件 file-list的动态绑定实现

    这篇文章主要介绍了vue element upload组件 file-list的动态绑定实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 在vue项目中使用Swiper插件详解

    在vue项目中使用Swiper插件详解

    这篇文章主要介绍了在vue项目中使用Swiper插件详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue刷新页面时去闪烁提升用户体验效果的实现方法

    vue刷新页面时去闪烁提升用户体验效果的实现方法

    这篇文章主要介绍了vue刷新页面时去闪烁提升体验方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • 基于Vue+echarts编写一个折线图

    基于Vue+echarts编写一个折线图

    这篇文章主要为大家详细介绍了如何利用Vue和Echarts实现绘制折线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-05-05
  • Vue2.x Todo之自定义指令实现自动聚焦的方法

    Vue2.x Todo之自定义指令实现自动聚焦的方法

    我们希望用户双击 todo 进入编辑状态后输入框自动获取焦点,而不是需要先手动点一下。这篇文章主要介绍了Vue 2.x Todo之自定义指令实现自动聚焦,非常具有实用价值,需要的朋友可以参考下
    2019-01-01
  • Vue渲染过程浅析

    Vue渲染过程浅析

    这篇文章主要介绍了Vue渲染过程浅析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03

最新评论