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

news2024/11/24 17:26:34

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

  • 方法一:使用Axios实现文件流下载
      • 优点
      • 缺点
  • 方法二:使用封装的Request工具实现文件流下载
      • 优点
      • 缺点
  • 方法三:直接通过URL跳转下载
      • 优点
      • 缺点
  • 结论

在前端开发中,有时需要从后端获取文件流,并将其下载到本地。本文介绍如何在前端实现此功能的不同的实现方法,并分析其优缺点

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

使用Axios实现文件流下载的方法,本人亲测可以实现

import axios from 'axios';
import { getToken } from '@/utils/auth'

handleExport() {
  // 接口调用获取文件
  axios({
    method: 'get',
    responseType: 'blob', // 指定响应类型为blob
    url: this.GLOBAL.baseURL + '/api/v1/business/user/export',
    data: this.queryParams, // 导入文件一般都用FormData格式数据
    headers: { 'Authorization': 'Bearer ' + getToken() } // 传递token进行身份验证
  }).then(res => {
    if (res.code === 200) {
      // 导入成功
      this.downloadBinaryFile(res.data, '导入失败后下载的报错文件')
    } else {
      // 输出失败信息
    }
  }).catch(error => {
    console.error('下载失败', error);
  });
},
    
/**
 * 将二进制文件下载到本地,保存为excel文件
 * @param {*} binFile 二进制文件流
 * @param {*} fileName 下载后的文件名
 * @param {*} blobType 文件格式,默认为 "application/vnd.ms-excel"
 */
downloadBinaryFile(binFile, fileName, blobType = "application/vnd.ms-excel") {
  // 创建 Blob 对象,包含二进制文件流和文件类型
  const blobObj = new Blob([binFile], { type: blobType });
  
  // 创建下载链接元素
  const downloadLink = document.createElement('a');
  
  // 处理不同浏览器的 URL 兼容性
  let url = window.URL || window.webkitURL; 
  url = url.createObjectURL(blobObj); // 创建文件 URL
  
  // 设置下载链接属性
  downloadLink.href = url;
  downloadLink.download = fileName;
  
  // 将下载链接添加到文档中并触发点击事件
  document.body.appendChild(downloadLink);
  downloadLink.click();
  
  // 移除下载链接并释放 URL 对象
  document.body.removeChild(downloadLink);
  window.URL.revokeObjectURL(url);
}

实现的效果

image-20240613095753872

优点

  • 支持传递Token进行身份验证,安全性较高
  • 支持POST请求,可以将参数放在请求体中,避免URL长度限制及参数暴露

缺点

  • 实现相对复杂,需要手动创建和管理Blob对象及下载链接

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

接下来介绍使用封装的Request工具实现文件流下载的方法

import request from '@/utils/request'

// 日志管理收藏、浏览、下载导出接口
export function exportUserOperateAdmin(data, headers) {
  return request({
    url: '/business/user/export',
    method: 'get',
    data: data,
    headers: headers
  })
}

// 调用导出接口
exportUserOperateAdmin(this.queryParams, { responseType: 'blob' }).then(
  response => {
    console.log(response)
    const url = window.URL.createObjectURL(new Blob([response.data])) // 创建下载链接
    const link = document.createElement('a')
    link.href = url
    link.download = '全文导入模板.xlsx' // 设置文件名
    document.body.appendChild(link)
    link.click() // 触发下载
    document.body.removeChild(link) // 下载后移除元素
  }
).catch(error => {
  console.error('下载失败', error)
  this.loading = false // 停止加载,隐藏加载状态
})

优点

  • 封装后的Request工具调用简单,代码更简洁
  • 支持传递Token进行身份验证,安全性较高

缺点

  • 实现相对简单,但仍需手动处理Blob对象及下载链接

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

最后介绍直接通过URL跳转实现文件下载的方法

const baseurl = this.GLOBAL.baseURL
// 拼接上导出的地址,如果接口还需要其他参数,都可以直接拼接上
let url = baseurl + '/api/v1/business/user/export';
console.log(url)
alert(url)
// 第二个参数'_self'表示在当前页下载,不打开新的页面
window.open(url, '_self')

优点

  • 实现简单,不需要处理Blob对象及下载链接
  • 适合下载无需身份验证或参数简单的文件

缺点

  • 无法传递Token进行身份验证,安全性较低
  • 参数放在URL中不安全,且可能会导致URL过长
  • 处理中文参数可能会出现乱码问题

结论

以上三种方法各有优缺点,实际开发中可以根据具体需求选择合适的方法。

如果需要传递Token进行身份验证并确保下载安全性,推荐使用方法一或方法二

如果只是简单下载无需验证的文件,可以考虑使用方法三

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解决方案】数据采集工作站数据传不上去?

数据采集工作站扮演着至关重要的角色,它们负责收集、处理和传输各种传感器和设备的数据。然而,有时会遇到数据传输失败的问题。本文将详细探讨数据采集工作站数据传不上去的可能原因及其解决方案。(更多了解采集器设备可前往苏州稳联&#xf…

芯片封测从入门到精通

文章目录 📑前言一、作者简介二、书籍亮点三、内容简介四、适读人群 📑前言 在科技日新月异的今天,芯片作为现代电子设备的核心部件,其性能与可靠性直接决定了整个产品的竞争力。而芯片封测,作为确保芯片性能与可靠性…

闭包、内存泄漏、垃圾回收详解

首先要说清楚这个话题&#xff0c;必须要先清楚什么是垃圾回收&#xff0c;要清楚什么是垃圾回收呢&#xff0c;必须要知道什么是垃圾&#xff0c;所谓的垃圾就是不再需要的内存&#xff0c;需要或者不需要是由人为来决定的 <!DOCTYPE html> <html lang"en"…

原生APP和H5 APP的区别

原生APP和H5 APP是两种常见的移动应用开发方式。它们在技术架构、性能表现、开发成本、用户体验等方面都有着明显的区别。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 技术架构 原生APP&#xff1a;原生APP是使用手机操作系统的…

表格识别工具哪个好?简单操作,一键识别表格

随着2024年高考的圆满结束&#xff0c;考生们迎来了新的挑战——志愿填报。这不仅是一个技术活&#xff0c;更是一个信息战。 面对海量的高校信息和复杂的数据表格&#xff0c;考生们需要一种快速、准确的方法来整理和分析这些数据。幸运的是&#xff0c;现代科技提供了多种表…

CPRI协议理解——控制字内容

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 CPRI协议理解——控制字内容 前言同步标识L1 Inband ProtocolZ130.0Z.194 C&M 通道慢速C&M 通道快速C&M 通道Vendor Specific DataControl AxC Data 后记 前言 …

m4s转mp3——B站缓存视频提取音频

前言 しかのこのこのここしたんたん&#xff08;鹿乃子乃子虎视眈眈&#xff09;非常之好&#xff0c;很适合当闹钟&#xff0c;于是缓存了视频&#xff0c;想提取音频为mp3 直接改后缀可乎&#xff1f;格式转换工具&#xff1f; 好久之前有记录过转MP4的&#xff1a; m4s转为…

DbGate 开源、免费的 、智能的、NoSQL SQL 数据库工具

1、简介 DbGate 是麻省理工学院许可的开源项目。支持Windows、Linux、MacOS、WEB(Docker、NPM) 2、下载地址/官网 DbGate | Open Source SQLnoSQL Database Client Tips&#xff1a;下载时建议使用稳定版本哦&#xff01; 3、支持的数据库 MySQL、SQLServer、Oracle、Postg…

【C++提高编程-08】----C++ STL之常用查找算法

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

实用技巧,用lsof命令监控tar文件解压进度,简单有效!

在Linux系统中&#xff0c;tar命令是一个非常常用的工具&#xff0c;用于创建和解压缩归档文件。尽管tar命令本身没有提供直接查看解压进度的功能&#xff0c;但我们可以借助lsof&#xff08;List Open Files&#xff09;命令来间接监控解压进度。本文将详细介绍如何使用lsof命…

C#:ThreadPool 实现高效多线程处理

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 在现代软件开发中&#xff0c;提升应用程序的并发能力和性能是一个重要的任务。C# 提供了多种实现并发的方式&#xff0c;其中&#xff0c;ThreadPool&#xff08;线程池&#xff0…

亚马逊新店如何实现高效流量转化?自养号测评深度解析与实用策略

在亚马逊平台上&#xff0c;自养号测评是一种通过卖家自行控制的海外买家账号对商品进行评价的方法&#xff0c;旨在提高商品的排名和流量。 亚马逊的自养号测评是指卖家通过使用在海外真实环境注册的买家账号&#xff0c;代替真实买家对商品进行测评。账号由卖家自己管理&…

Python对象复制竟然有这么多种方式,赶紧学起来!

目录 1、浅拷贝:copy模块的copy()函数 📋 1.1 浅拷贝原理揭秘 1.2 实战演示:列表与字典的浅拷贝 列表浅拷贝示例 字典浅拷贝示例 1.3 注意事项:共享引用与独立对象 2、深拷贝:copy模块的deepcopy()函数 📌 2.1 深拷贝实现机制解析 2.2 深拷贝优势分析 2.3 深度…

SRM供应商管理系统建设方案及源码实现(方案+源码)

1. 供应商管理 2. 采购需求管理 3. 采购寻源管理 4. 采购合同管理 5. 采购订单管理 6. 采购协同管理 7. 外部商城采购管理 8. 报表查询管理 9. 系统管理 10. 集成管理 资料获取&#xff1a;本文末个人名片。

了解压电传感器:压电效应

压电加速度计的个关键方面是压电效应。一般来说&#xff0c;压电材料在受到机械应力时可以产生电力。 相反&#xff0c;对压电材料施加电场可以使其变形并产生小的机械力。尽管大多数电子工程师都熟悉压电效应&#xff0c;但有时并没有完全理解这种有趣现象的细节。 更深入地…

visualbox搭建linux环境双网卡配置

文章目录 1. 双网卡模式简介2. 网络模式配置2.1 virtualBox说明2.2 host-only网络模式配置2.3 NAT网络模式配置 3. 虚拟主机网络设置3.1 网卡一设置3.2 网卡二设置 4. 网卡配置5. ssh访问 本篇的目的是为了搭建本地的linux测试环境用。 1. 双网卡模式简介 双网卡网络模式简介 …

期货交易如何定义趋势?

从任何交易周期来看&#xff0c;行情无非就处在趋势、震荡这两种情况中。如果我们再把一个新的趋势突破原来的状态&#xff0c;逐步成为有力量的趋势&#xff0c;叫做反转&#xff0c;那么可以有三个形态&#xff0c;即趋势形态、震荡形态、反转形态。 做交易的人&#xff0c;…

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机&#xff0c;死信邮箱。当消息在一个队列中变成死信之后&#xff0c;它能重新发送到另外一个交换器中&#xff0c;这个交换器就是DLX&#xff0c;绑定DLX的队列就称为死信队列。 导致死信的几种原因&#xff1a; ● 消息…

GIS开发程序员简历怎么写?

GIS开发或者是数据处理等相关岗位&#xff0c;其本质还是开发类技术岗位。所以怎么让你的简历脱颖而出&#xff0c;最最重要的就是&#xff0c;简历上要展现两点&#xff1a;你有能力能胜任此岗位和你有潜力可以快速胜任此岗位&#xff08;校招上也看中这点&#xff09;。 那G…

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

目录 0 专栏介绍1 什么是距离场&#xff1f;2 欧氏距离场计算原理3 双线性插值与欧式梯度场4 仿真实现4.1 ROS C实现4.2 Python实现 0 专栏介绍 &#x1f525;课程设计、毕业设计、创新竞赛、学术研究必备&#xff01;本专栏涉及更高阶的运动规划算法实战&#xff1a;曲线生成…