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

ops/2024/10/22 16:28:29/

目录

一、问题

二、解决方法

三、总结


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

一、问题

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

二、解决方法

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

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

javascript">//后端接口
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标签下载文件,最后删除文件

javascript">//创建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.完整代码如下:未选中数据导出全部;选中数据直接导出选中的数据

javascript">//导出数据
//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.ppmy.cn/ops/39822.html

相关文章

5.神经网络-激活函数

目录 1. 激活函数不是阶跃函数 1.1 激活函数和阶跃函数都是非线性函数 1.2 激活函数不是阶跃函数 2. sigmoid 函数 2.1 sigmoid 函数表达式 2.2 sigmoid 函数 Python 实现 2.4 sigmoid 函数图 3. ReLU 函数 3.1 ReLU 函数表达式 3.2 ReLU 函数 Python 实现 3.4 ReLU…

HDFS HA 修改nameservice

本例中修改将原来的hdfs-ha 修改为 hdfs-ns 停止HDFS, 防止新的业务操作 等待停止结束 KDE中需要调整的配置项如下图所示 a.搜索栏找到fs.defaultFS,将hdfs://hdfs-ha改为hdfs://hdfs-ns b.搜索栏找到dfs.nameservices,将hdfs-ha改为hdfs-ns c.搜索栏找…

什么是IP跳变?

IP 跳跃(也称为 IP 跳动)的概念已引起使用代理访问网站的用户的极大关注。但 IP 跳跃到底是什么?为什么它对于各种在线活动至关重要? 在本文中,我们将深入探讨 IP 跳跃的世界,探索其实际应用、用例、潜在问…

社交媒体数据恢复:脉脉

在使用社交软件脉脉的过程中,可能会遇到数据丢失的情况,如误删了重要信息或者更换手机后数据未能同步等问题。那么如何恢复脉脉中的数据呢?本文将为您提供详细的步骤指导。 注意:以下操作需要在脉脉账户登录状态下进行。 登录脉…

mysql 启动指定pid 文件位置

MySQL服务启动时,可以指定用于存储进程ID文件的位置。这通常通过在启动服务时使用--pid-file选项来完成。如果你想要改变默认的PID文件位置,可以在my.cnf(在Unix系统上通常位于/etc/my.cnf或/etc/mysql/my.cnf)或my.ini&#xff0…

2024.04.30校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招&实习 | 零跑汽车校园招聘 - 三电研发专场(内推) 校招&实习 | 零跑汽车校园招聘 - 三电研发专场(内推) 2、校招丨海尔智家2…

Android之给Button上添加按压效果

一、配置stateListAnimator参数实现按压效果 1、按钮控件 <Buttonandroid:id"id/mBtnLogin"android:layout_width"match_parent"android:layout_height"48dp"android:background"drawable/shape_jfrb_login_button"android:state…

即插即用篇 | YOLOv8引入轴向注意力 Axial Attention | 多维变换器中的轴向注意力

本改进已集成到 YOLOv8-Magic 框架。 我们提出了Axial Transformers,这是一个基于自注意力的自回归模型,用于图像和其他组织为高维张量的数据。现有的自回归模型要么因高维数据的计算资源需求过大而受到限制,要么为了减少资源需求而在分布表达性或实现的便捷性上做出妥协。相…