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

news/2024/5/19 21:30:25

目录

一、问题

二、解决方法

三、总结


tiips:如嫌繁琐,直接移步总结即可!

一、问题

1.需要导出功能,后端已经返回了二进制文件,前端如何下载呢?

二、解决方法

1.数据类型转换:将后端的二进制数据转换为文件对象。

createObjectURL中第二个参数{type:'xxxx'}要和接口的返回数据类型responseType保持一致

//后端接口
export const _exportPageData = (data) =>
request({url: '/test/borrow/export',method: 'post',responseType:'arraybuffer',data
})//处理后端返回数据为文件对象,作为a标签的url
// type和上面接口的responseType最好要保持一致
let url=window.URL.createObjectURL(new Blob([result],{type:'arraybuffer'}))

2.body上添加a标签,href为转换好的Blob数据 url,点击a标签下载文件,最后删除文件

//创建a标签
let link=document.createElement('a')
link.herf=url
link.downloda='已导出数据.xlsx';
//避免数据量过大,下载时间长,看到a标签
link.style.display = 'none';
//挂载a标签
document.body.appendChild(link)
//下载
link.click()
//移除a标签
document.body.removeChild(link)//清除ObjectURL,释放内存
window.URL.revokeObjectURL(url);

3.完整代码如下:未选中数据导出全部;选中数据直接导出选中的数据

//导出数据
//title:标题
//dataLength:导出数量为0时导出所有
//对于非arrayBuffer数据,需要传入config.type
export const exportData = ({ api, params }, dataLength, config) => {const getData = () => {return api(params).then((result) => {//默认处理 ArrayBuffer数据if (result.byteLength) {let url = window.URL.createObjectURL(new Blob([result], { type: config?.type || 'arraybuffer' }));let link = document.createElement('a');link.href = url;link.style.display = 'none';link.download = config?.title || '已导出数据.xlsx';document.body.appendChild(link)link.click()document.body.removeChild(link)window.URL.revokeObjectURL(url);Message({type: 'success',message: '导出成功!'})return result}}).catch((error) => {Message.error('导出失败')console.log("exportData error:", error)})}return new Promise(async (resolve, reject) => {let result = null;if (!dataLength) {result = await MessageBox.confirm('是否需要导出所有数据', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {return getData()}).catch(() => {return;})} else {result = await getData()}resolve(result)})}//调用方法
// exportData({api:_exportPageData,params},idsList.value.length,{title:"test.xlsx"})
// ?.then((result)=>{
//     console.log("result",result)
// })

三、总结

1.后端返回二进制数据前端下载:1)转换为文件对象; 2)a标签配置href属性(数据源),download属性(文件名称),下载,移除a标签

2. window.URL.createObjectURL()创建一个指向给定参数的File对象或Blob对象存储在内存中,直到document被卸载时才清除;所以如果有多次调用的情况,避免内存溢出,提高新能需要 手动使用 window.URL.revokeObjectURL(url)清除

3.诶,记忆不如写下来,不写又忘了。

/*

希望对你有帮助!

如有错误,欢迎指正,非常感谢!

*/


http://www.mrgr.cn/p/17616755

相关文章

Shell编程规范与变量

目录1.Shell脚本概述2.Shell编程规范(1)编写脚本代码(2)脚本编写结构(3)Shell脚本的运行3.重定向与管道(1)交互式硬件设备(2)重定向操作(3)管道操作“|”4.Shell脚本变量(1)自定义变量(1)定义一个新的变量(2)赋值时使用引号(3)设置变量的作用范围(4)整数…

SpringBoot3项目打包和运行

六、SpringBoot3项目打包和运行 6.1 添加打包插件 在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置,使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找…

C++面试题(三)

1、程序有哪些section,分别的作用?程序启动的过程?怎么判断数据分配在栈上还是堆上?如上图,从低地址到高地址,一个程序由代码段、数据段、 BSS 段组成。 \1. 数据段:存放程序中已初始化的全局变量和静态变量的一块内存区域。 \2. 代码段:存放程序执行代码的一块内存区域…

珂朵莉树/颜色段均摊

名称简介 珂朵莉树(Chtholly Tree),又名老司机树 ODT(Old Driver Tree)。起源自 CF896C。 注意,这种想法的本质是基于数据随机的「颜色段均摊」,而不是一种数据结构,下文介绍的操作是这种想法的具体实现方法。 前置知识 会用 STL 的 set 就行。 核心思想 把值相同的区间…

1、数仓基础

1、数据仓库的概念 数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。数据仓库本身并不“生产”任何数据,其数据来源于不同外部系统;…

第七章——程序设计语言基础知识

基本概念,编译与解释,文法,有限自动机。正规式,表达式,传值与引用(传值),各种程序语言特点第七章——程序设计语言基础知识 7.1 基本概念 7.1.1 低级语言和高级语言 通常称机器语言和汇编语言为低级语言。机器语言是指用0、1字符串组成的机器指令序列,是最基本的计算机语…

js浏览器请求,post请求中的参数形式和form-data提交数据时数据格式问题(2024-05-06)

浏览器几种常见的post请求方式 Content-Type 属性规定在发送到服务器之前应该如何对表单数据进行编码。 默认表单数据会编码为 "application/x-www-form-urlencoded" post请求的参数一般放在Body里。 Content-Type(内容类型),一般…

软件设计师:软件工程基础知识

能力模型 CMM(能力成熟度模型)初始级:没明确定义 可重复级:建立基本的项目管理过程和实践 已定义级:文档化、标准化 已管理级:管理层制定了软件过程和产品质量的详细度量标准 优化级:不断持续地改进CMMI(能力成熟度模型集成)基本不考已执行的:可标识的输入转换为可标…

rust使用Atomic创建全局变量和使用

Mutex用起来简单,但是无法并发读,RwLock可以并发读,但是使用场景较为受限且性能不够,那么有没有一种全能性选手呢? 欢迎我们的Atomic闪亮登场。 从 Rust1.34 版本后,就正式支持原子类型。原子指的是一系列…

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。 在前面,我们一直使用的是字符串插…

C语言阶段性测试错题纠正与拓展

引言:在2024年4月26日,我进行了C语言知识的“期末考试”。通过这次考试,我发现了我的知识漏洞。所以,我写下这篇博客来记录我的错题,并进行纠正,然后对于以前遗忘知识的回顾。 更多有关C语言的知识详解可前…

TextMeshPro - 富文本标签

初始文本 粗体<b></b> 斜体<i></i> 颜色<#ff0000></color> 大小<size></size> <size=60%>中</size><size=1.2em>中</size> 下划线<u></u> 删除线<s></s> 上标<sup…

通信录的动态版本

一. 增加需求 在学习了动态开辟内存之后 我们对于通讯录产生了新的需求 要求我们做出一个动态增长的版本 即 随着我们储存联系人的增加 储存的空间增加 要求 &#xff1a; 1 初始空间为3 2 每次达到上限之后 扩容两个内存 二. 动手实施 我们首先要创建一个结构体 结构体…

C#中.net8WebApi加密解密

尤其在公网之中&#xff0c;数据的安全及其的重要&#xff0c;除过我们使用jwt之外&#xff0c;还可以对传送的数据进行加密&#xff0c;就算别人使用抓包工具&#xff0c;抓到数据&#xff0c;一时半会儿也解密不了数据&#xff0c;当然&#xff0c;加密也影响了效率&#xff…

Linux 中 2>1 解释

在Linux系统中: 0 表示标准输入; 1表示标准输出; 2表示标准错误输出; 2>&1 表示将标准错误输出重定向到标准输入; 举一个例子: a、不将标准错误输出 重定向到标准输入中。[root@PC1 gffread-0.12.7.Linux_x86_64]# xxx ## 在终端随机输入一个命…

基于SpringBoot的饭店外卖平台的设计与实现

项目描述 这是一款基于SpringBoot的饭店外卖平台的系统 模块描述 用户端 登录 首页 商家信息 点餐 菜品列表 下单 订单列表 账号下单列表 个人中心 个人资料 修改信息 评论管理 评论菜品 查看评论 打赏骑手 打赏骑手 管理员 登录 菜品管理 修改 下架 订单列表 下单记录 菜品管理…

用Docker 创建并运行一个MySQL容器

可以在DockerHub官网上荡:mysql - Official Image | Docker Hub 指令是:docker pull mysql; 因为文件比较大可能时间比较长&#xff0c;我是跟着黑马的课走的 课程提供的有文件&#xff0c;我就用已有的资源了。 在tmp目录里放入mysql.tar包 然后cd进去 输入指令:docker lo…

Day 26 数据库日志管理

数据库日志管理 一&#xff1a;日志管理 1.日志分类 ​ 错误日志 &#xff1a;启动&#xff0c;停止&#xff0c;关闭失败报错。rpm安装日志位置 /var/log/mysqld.log ​ 通用查询日志&#xff1a;所有的查询都记下来 ​ 二进制日志&#xff1a;实现备份&#xff0c;增量备份…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括&#xff1a;&#xff08;含教学视频、参考材料、测验&#xff09; 基础入门&#xff1a;45分钟深入了解生成式AI 简单实操&#xff1a;30分钟掌握大语言模型 了解如何释放生成式 AI S…

《十九》Qt Http协议及实战

前言 本篇文章来给大家讲解QT中的Http协议&#xff0c;Http协议主要用于网络中数据的请求和响应&#xff0c;那么这篇文章将给大家讲解一下这个协议。 一、HTTP概述 HTTP&#xff08;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;它定义了客户端…