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

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

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

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

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

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

import axios from 'axios';
import { getToken } from '@/utils/auth'handleExport() {// 接口调用获取文件axios({method: 'get',responseType: 'blob', // 指定响应类型为bloburl: 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 = urllink.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.mzph.cn/news/852535.shtml

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

相关文章

性能测试3【搬代码】

1.Linux服务器性能分析命令及详解 2.GarafanainfluxDB监控jmeter数据 3.GarafanaPrometheus监控服务器和数据库性能 4.性能瓶颈分析以及性能调优方案详解 一、无界面压测时, top load average:平均负载 htop 二、Garafana监控平台 传统项目:centosphpm…

网站接口是怎么开发的,开发之后是怎么用的

网站接口的开发流程 1.确定接口需求 在开发接口之前我们先要知道,要开发什么样的接口,这个接口是用来干什么的,得先知道相关的需求,才能规划下一步,比如客户想要一个文章列表,那么我们就知道这个需求…

kettle从入门到精通 第六十九课 ETL之kettle kettle cdc mysql,轻松实现增量同步

1、之前kettle cdc mysql的时候使用的方案是canalkafkakettle,今天我们一起学习下使用kettle的插件Debezium直接cdc mysql。 注:CDC (Change Data Capture) 是一种技术,用于捕获和同步数据库中的更改。 1)Debezium步骤解析mysql b…

基于Python+OpenCV高速公路行驶车辆的速度检测系统

简介: 基于Python和OpenCV的高速公路行驶车辆的速度检测系统旨在实时监测高速公路上的车辆,并测量它们的速度。该系统可以用于交通监控、道路安全管理等领域,为相关部门提供重要的数据支持。 系统实现: 视频流输入:系…

Antd 自定义列表全选功能

背景 需要为List组件自定义全选功能,如下图所示: 全选checkbox需要与下面每一项的checkbox联动;当从第一页翻页到第二页的时候,第一页已选的内容保持,可以对第二页勾选,同时保证全选checkbox的状态是正确的…

当JS遇上NLP:开启图片分析的奇幻之旅

前言 在当今科技飞速发展的时代,JavaScript(JS)作为广泛应用的编程语言,展现出了强大的活力与无限的可能性。与此同时,自然语言处理(NLP)领域也正在经历着深刻的变革与进步。 当这两者碰撞在一…

【并发编程系列一】并发编年史:线程的双刃剑——从优势到风险的全面解析

文章目录 并发简史🖥️初期探索(20世纪50-60年代)并发理论基础(1965年以后)并行计算的兴起(1970年代至1980年代)现代并发技术(1990年代至今) 线程的优势😍发挥…

DDei在线设计器-API概述

API文档 本文档提供了DDei组件所包含的关键API接口,以及重要类之间的关系,并以可运行示例代码的形式说明API的调用,便于开发人员进行查阅、调试和复制。 如需了解详细的API教程以及参数说明,请参考DDei文档 设计器 设计器API用于…

【车载AI音视频电脑】200万像素迷你一体机

产品主要特点: -设备安装方便简洁,可通过3M胶直接将设备粘 贴到车前挡风玻璃上 -支持IE预览,手机,PAD实时预览, 支持电脑客 户端实时预览功能 -内置2路模拟高清, 每路均可达到200万像素。另 外可扩充2路1080P模拟…

基于springboot实现问卷调查系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现问卷调查系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,问卷信息因为其管理内容繁杂,管理数…

go context 源码刨析(一)

Context 上下文context.Context 是用来设置截止时间、同步信号,传递请求相关值的结构体。 context.Context 定义了四个需要实现的方法: Deadline: 返回 context.Context 被取消的时间。Done: 返回一个 Channel,这个 Channel 会在当前工作完…

Django 5 Web应用开发实战

文章目录 一、内容简介二、目录内容三、值得一读四、适读人群 一、内容简介 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体,是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和…

UML相关2

内容 说明 用例编号 UC-1 用例名称 客户注册 用例说明 客户参与者通过注册获得进入彬使用系统的权限 参与者 客户 前置条件 无 后置条件 系统正确接收用户信息并保存到数据库 基本路径 发布注册申请系统显示注册页面客户填写相应信息并提交注册成功后可以进行其…

1毛钱1百万token,写2遍红楼梦!国产大模型下一步还想卷什么?

大模型价格战,这匹国产黑马又破纪录了!最低的GLM-4 Flash版本,百万token价格已经低至0.1元,可以说是击穿地心。MaaS 2.0大升级,让企业训练私有模型的成本无限降低。 刚刚,智谱AI开放日上,新一代…

QT 5.14.2 应用程序打包

我们可以直接通过开发工具预览我们的程序。但是当要把开发好的程序给别人使用的时候,我们就需要把程序打包成可执行的exe,然后把这个exe文件和其他相关的文件一起发给别人,这样别人就可以使用了。 一、生成可独立运行的exe (一)、编译程序的Release版本 1、切换编译方式为…

基于C#开发web网页管理系统模板流程-打包发布

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 本系列中,作为开发者我们通过ASP.net Web模板设计网页,网页的任何设计、源代码都是直接可见的,在实际应用开发中,显然这些都是商业、公司机密 通过打包…

【Effective Web】常见的css居中方式

CSS居中方式 水平居中 text-align:center 适用范围:容器中都是行内元素 缺点:容器内所有元素都会居中,如果是文本描述需要左对齐,需要增加text-align:left覆盖 margin: 0 auto 适用范围:容器宽度固定。子元素宽度…

UML精简概述

UML精简概述 UML精简概述 UML精简概述UML的定义常见的关系 在学习设计模式之前,需要掌握一些预备知识,主要包括UML类图和面向对象设计原则,它们是“基础内功”,将为后续的“深入修行”奠定基础。UML类图可用于描述每一个设计模式的…

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…

BL104钡铼多协议采集网关助力企业智能化转型

BL104钡铼多协议采集网关&#xff08;PLC物联网关BL104&#xff09;是为满足工业环境需求而设计的专业工业级协议转换网关。它在企业智能化转型过程中扮演着关键角色&#xff0c;为企业提供了高效、稳定的通信解决方案&#xff0c;助力企业实现智能化转型。 首先&#xff0c;P…