前端实现获取后端返回的文件流并下载

[复制链接]
发表于 2025-10-2 00:25:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
前端实现获取后端返回的文件流并下载



  • 方法一:使用Axios实现文件流下载




      • 长处
      • 缺点


  • 方法二:使用封装的Request工具实现文件流下载




      • 长处
      • 缺点


  • 方法三:直接通过URL跳转下载




      • 长处
      • 缺点


  • 结论
在前端开发中,偶然须要从后端获取文件流,并将其下载到当地。本文先容怎样在前端实现此功能的差异的实现方法,并分析其优缺点
方法一:使用Axios实现文件流下载

使用Axios实现文件流下载的方法,本人亲测可以实现
  1. import axios from 'axios';
  2. import { getToken } from '@/utils/auth'
  3. handleExport() {
  4.   // 接口调用获取文件
  5.   axios({
  6.     method: 'get',
  7.     responseType: 'blob', // 指定响应类型为blob
  8.     url: this.GLOBAL.baseURL + '/api/v1/business/user/export',
  9.     data: this.queryParams, // 导入文件一般都用FormData格式数据
  10.     headers: { 'Authorization': 'Bearer ' + getToken() } // 传递token进行身份验证
  11.   }).then(res => {
  12.     if (res.code === 200) {
  13.       // 导入成功
  14.       this.downloadBinaryFile(res.data, '导入失败后下载的报错文件')
  15.     } else {
  16.       // 输出失败信息
  17.     }
  18.   }).catch(error => {
  19.     console.error('下载失败', error);
  20.   });
  21. },
  22.    
  23. /**
  24. * 将二进制文件下载到本地,保存为excel文件
  25. * @param {*} binFile 二进制文件流
  26. * @param {*} fileName 下载后的文件名
  27. * @param {*} blobType 文件格式,默认为 "application/vnd.ms-excel"
  28. */
  29. downloadBinaryFile(binFile, fileName, blobType = "application/vnd.ms-excel") {
  30.   // 创建 Blob 对象,包含二进制文件流和文件类型
  31.   const blobObj = new Blob([binFile], { type: blobType });
  32.   
  33.   // 创建下载链接元素
  34.   const downloadLink = document.createElement('a');
  35.   
  36.   // 处理不同浏览器的 URL 兼容性
  37.   let url = window.URL || window.webkitURL;
  38.   url = url.createObjectURL(blobObj); // 创建文件 URL
  39.   
  40.   // 设置下载链接属性
  41.   downloadLink.href = url;
  42.   downloadLink.download = fileName;
  43.   
  44.   // 将下载链接添加到文档中并触发点击事件
  45.   document.body.appendChild(downloadLink);
  46.   downloadLink.click();
  47.   
  48.   // 移除下载链接并释放 URL 对象
  49.   document.body.removeChild(downloadLink);
  50.   window.URL.revokeObjectURL(url);
  51. }
复制代码
实现的结果

长处



  • 支持转达Token举行身份验证,安全性较高
  • 支持POST哀求,可以将参数放在哀求体中,制止URL长度限定及参数袒露
缺点



  • 实现相对复杂,须要手动创建和管理Blob对象及下载链接
方法二:使用封装的Request工具实现文件流下载

接下来先容使用封装的Request工具实现文件流下载的方法
  1. import request from '@/utils/request'
  2. // 日志日志管理收藏、浏览、下载导出接口
  3. export function exportUserOperateAdmin(data, headers) {
  4.   return request({
  5.     url: '/business/user/export',
  6.     method: 'get',
  7.     data: data,
  8.     headers: headers
  9.   })
  10. }
  11. // 调用导出接口
  12. exportUserOperateAdmin(this.queryParams, { responseType: 'blob' }).then(
  13.   response => {
  14.     console.log(response)
  15.     const url = window.URL.createObjectURL(new Blob([response.data])) // 创建下载链接
  16.     const link = document.createElement('a')
  17.     link.href = url
  18.     link.download = '全文导入模板.xlsx' // 设置文件名
  19.     document.body.appendChild(link)
  20.     link.click() // 触发下载
  21.     document.body.removeChild(link) // 下载后移除元素
  22.   }
  23. ).catch(error => {
  24.   console.error('下载失败', error)
  25.   this.loading = false // 停止加载,隐藏加载状态
  26. })
复制代码
长处



  • 封装后的Request工具调用简单,代码更简便
  • 支持转达Token举行身份验证,安全性较高
缺点



  • 实现相对简单,但仍需手动处理处罚Blob对象及下载链接
方法三:直接通过URL跳转下载

末了先容直接通过URL跳转实现文件下载的方法
  1. const baseurl = this.GLOBAL.baseURL
  2. // 拼接上导出的地址,如果接口还需要其他参数,都可以直接拼接上
  3. let url = baseurl + '/api/v1/business/user/export';
  4. console.log(url)
  5. alert(url)
  6. // 第二个参数'_self'表示在当前页下载,不打开新的页面
  7. window.open(url, '_self')
复制代码
长处



  • 实现简单,不须要处理处罚Blob对象及下载链接
  • 恰当下载无需身份验证或参数简单的文件
缺点



  • 无法转达Token举行身份验证,安全性较低
  • 参数放在URL中不安全,且大概会导致URL过长
  • 处理处罚中文参数大概会出现乱码题目
结论

以上三种方法各有优缺点,现实开发中可以根据具体需求选择符合的方法。
如果须要转达Token举行身份验证并确保下载安全性,保举使用方法一或方法二
如果只是简单下载无需验证的文件,可以思量使用方法三
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表