前端实现下载功能汇总(下载二进制流文件、数组下载成csv、将十六进制下载成pcap、将文件下载成zip)
前言:汇总一下做过的下载功能,持续补充中
一、将后端传过来的二进制流文件下载(需要提取headers里面的文件名)
const { herders,data }=res;
// 创建下载链接元素
const link = document.createElement("a");// 创建 Blob 对象,将服务器响应的数据作为 Blob 的内容
const blob = new Blob([data], { type: "application/vnd.ms-excel" });// 解析服务器响应头中的 Content-Disposition 字段获取文件名
var patt = new RegExp("filename=([^;]+\\.[^\\.;]+);*");
var contentDisposition = decodeURI(headers["content-disposition"]);
var result = patt.exec(contentDisposition);
var fileName = result[1];
fileName = fileName.replace(/\"/g, "");// 隐藏下载链接元素
link.style.display = "none";// 设置下载链接的属性
link.href = URL.createObjectURL(blob);
link.setAttribute("download", fileName);// 将下载链接添加到页面中
document.body.appendChild(link);// 模拟点击下载链接
link.click();// 移除下载链接元素
document.body.removeChild(link);
以上代码可以直接copy进你的点击事件,然后根据你和后端约定的稍微改一下就行
需要理解的点:
1、res是后端传给我的数据,data是二进制流文件,headers里面有我需要的文件名,所以我将他们提取出来了;
2、创建blob时的type是用来指定不同的媒体类型(MIME),就是你要下载什么文件,我上面例子写的application/vnd.ms-excel就是微软 Excel 文件,那么就会下载成一个excel文件;
其他常见的MIME类型:
text/plain:纯文本文件,通常用于.txt文件。text/html:HTML 文件,用于网页文档。application/json:JSON 数据,用于传输和存储结构化数据。application/pdf:PDF 文件,用于可移植文档格式。image/jpeg:JPEG 图像文件。image/png:PNG 图像文件。audio/mp3:MP3 音频文件。video/mp4:MP4 视频文件。
这只是一小部分常见的MIME类型,实际上有很多种不同的MIME类型,每种类型对应不同的文件格式或媒体类型,要根据需要来选择。
3、
这些是用正则去卡文件名的操作,需要根据你的需求灵活变动
二、将后端传过来的二进制流文件下载(不需要提取文件名,前端来决定下载下来的文件叫什么
)
//创建 Blob 对象const blob = new Blob([row.traffic_meta], { type: "text/plain" });// 创建下载链接const url = URL.createObjectURL(blob);// 创建下载按钮const downloadLink = document.createElement("a");downloadLink.href = url;downloadLink.download = "example.txt"; // 设置下载文件的文件名// 将按钮添加到页面中document.body.appendChild(downloadLink);// 模拟点击下载链接downloadLink.click();// 移除下载按钮document.body.removeChild(downloadLink);
以上代码没有取后端传的文件名,是前端自己定义的,row.traffic_meta是二进制流文件,用的时候记得替换
三、将表格数据(数组)下载成csv文件
1、需求描述:下载一个表格,但是后端不传二进制文件流,而是接口返回给前端的数组。
类似这样的数据:
const tableData=[
{name: '1',value: 1},
{name: '2',value: 2},
{name: '3',value: 3},
{name: '4',value: 4},
{name: '5',value: 5},
{name: '6',value: 6},
{name: '7',value: 7},
]
要下载成一个csv,表头就是name和value
2、在utils创建一个js文件Export2Csv.js:
function processRow(row) {let finalVal = ''for (let j = 0; j < row.length; j++) {let innerValue = row[j] === null ? '' : row[j].toString()if (row[j] instanceof Date) {innerValue = row[j].toLocaleString()}let result = innerValue.replace(/"/g, '""')if (result.search(/("|,|\n)/g) >= 0) { result = '"' + result + '"' }if (j > 0) { finalVal += ',' }finalVal += result}return finalVal + '\n'
}export function exportToCsv(filename, rows) {let csvFile = ''for (let i = 0; i < rows.length; i++) {csvFile += processRow(rows[i])}// 添加\ufeff头,标识excel可以打开UTF8编码的文件const blob = new Blob(['\ufeff', csvFile], { type: 'text/csv;charset=utf-8;' })if (navigator.msSaveBlob) { // IE 10+navigator.msSaveBlob(blob, filename)} else {const link = document.createElement('a')if (link.download !== undefined) { // feature detection// Browsers that support HTML5 download attributeconst url = URL.createObjectURL(blob)link.setAttribute('href', url)link.setAttribute('download', filename)link.style.visibility = 'hidden'document.body.appendChild(link)link.click()document.body.removeChild(link)}}
}export function exportToCsv_zl(filename, rows) {let csvFile = ''for (let i = 0; i < rows.length; i++) {csvFile += processRow(rows[i])}// 添加\ufeff头,标识excel可以打开UTF8编码的文件// const blob= new Blob(['\ufeff', csvFile], { type: 'text/csv;charset=utf-8;' })console.log(csvFile);return csvFile
}export function exportDictArray2csv(data, filename,zl) {const keys = Object.keys(data[0])const rows = []// writer headerrows.push(keys)data.forEach(dict => {const row = []keys.forEach(key => {row.push(dict[key])})rows.push(row)})if(zl){return exportToCsv_zl(filename,rows)}else{exportToCsv(filename, rows)}}export default exportDictArray2csv
3、 导入在需要该功能的页面里使用
import { exportDictArray2csv } from "@/utils/Export2Csv.js";const filename = `data.csv`;
exportDictArray2csv(tableData.value, filename);
四、将16进制转化为pcap包并下载
1、方法代码:
// 将十六进制字符串转换为字节数组
function hexToBytes(hex) {const bytes = [];for (let i = 0; i < hex.length; i += 2) {bytes.push(parseInt(hex.substr(i, 2), 16));}return new Uint8Array(bytes);
}// 构建 PCAP 文件头
function createPcapHeader() {const header = new Uint8Array(24);const dataView = new DataView(header.buffer);dataView.setUint32(0, 0xa1b2c3d4, true); // magic numberdataView.setUint16(4, 2, true); // version majordataView.setUint16(6, 4, true); // version minordataView.setUint32(8, 0, true); // timezonedataView.setUint32(12, 0, true); // sigfigsdataView.setUint32(16, 65535, true); // snaplendataView.setUint32(20, 1, true); // linktypereturn header;
}// 创建 PCAP 数据包(这里仅作为示例,你需要根据具体数据填充)
function createPcapPacket(data) {const packetHeader = new Uint8Array(16);const dataView = new DataView(packetHeader.buffer);const timestamp = Math.floor(Date.now() / 1000); // 当前时间戳const microseconds = (Date.now() % 1000) * 1000; // 微秒部分const length = data.length;dataView.setUint32(0, timestamp, true); // secondsdataView.setUint32(4, microseconds, true); // microsecondsdataView.setUint32(8, length, true); // number of octets of packet saved in filedataView.setUint32(12, length, true); // actual length of the packetreturn { header: packetHeader, data };
}// 主函数
function createPcapFile(hexString) {const pcapHeader = createPcapHeader();const packetData = hexToBytes(hexString);const pcapPacket = createPcapPacket(packetData);// 拼接 PCAP 文件内容const pcapFile = new Uint8Array(pcapHeader.length + pcapPacket.header.length + pcapPacket.data.length);pcapFile.set(pcapHeader, 0);pcapFile.set(pcapPacket.header, pcapHeader.length);pcapFile.set(pcapPacket.data, pcapHeader.length + pcapPacket.header.length);return pcapFile;
}
2、使用该方法:
const pcapFile = createPcapFile(pkt_data);const blob1 = new Blob([pcapFile], { type: "application/octet-stream" });// 创建下载链接const url = URL.createObjectURL(blob1);// 创建下载按钮const downloadLink = document.createElement("a");downloadLink.href = url;downloadLink.download = "命中流量.pcap"; // 设置下载文件的文件名// 将按钮添加到页面中document.body.appendChild(downloadLink);// 模拟点击下载链接downloadLink.click();// 移除下载按钮document.body.removeChild(downloadLink);
五、将两个文件合成zip下载
1、先下载插件
npm i jszip
2、导入并使用
import JSZip from "jszip";import { saveAs } from "file-saver";const blob1 = res.data;const blob2 = new Blob(["\ufeff", exportDictArray2csv([row], "filename.csv", true)],{ type: "text/csv;charset=utf-8;" });const zip = new JSZip();// 将 blob 数据添加到 ZIP 文件zip.file(`原始流量.pcap`, blob1);zip.file("告警事件.csv", blob2);// 生成 ZIP 文件const zipBlob = await zip.generateAsync({ type: "blob" });saveAs(zipBlob, "files.zip");
以上代码就是将两个bolb传入插件并下载成了一个zip,解压之后就是:

相关文章:
前端实现下载功能汇总(下载二进制流文件、数组下载成csv、将十六进制下载成pcap、将文件下载成zip)
前言:汇总一下做过的下载功能,持续补充中 一、将后端传过来的二进制流文件下载(需要提取headers里面的文件名) const { herders,data }res; // 创建下载链接元素 const link document.createElement("a");// 创建 Bl…...
iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例
作者:UC 浏览器后端工程师,梁若羽 传统 ELK 方案 众所周知,ELK 中的 E 指的是 ElasticSearch,L 指的是 Logstash,K 指的是 Kibana。Logstash 是功能强大的数据处理管道,提供了复杂的数据转换、过滤和丰富…...
【MySQL】入门篇—基本数据类型:NULL值的概念
在关系数据库中,NULL值是一个特殊的标记,表示缺失或未知的值。 NULL并不等同于零(0)或空字符串(),它表示一个字段没有任何值。 这一概念在数据库设计和数据管理中至关重要,因为它影…...
Java设计模式10 - 观察者模式
观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自…...
LabVIEW示波器通信及应用
基于LabVIEW平台开发的罗德与施瓦茨示波器通信与应用系统实现了示波器的远程控制及波形数据的实时分析,通过TCP/IP或USB接口与计算机通信,利用VISA技术进行指令传输,从而实现高效的数据采集与处理功能。 项目背景 随着现代电子测试需求的日益…...
西门子PLC中Modbus通讯DATA_ADDR通讯起始地址设置以及RTU轮询程序设计。
1 DATA_ADDR通讯起始地址设置 因为西门子PLC保持型寄存器的是40001~49999和400001~465536, 那么什么时候用40001什么时候用400001呢? 当需要的地址超过49999的话就用400001。 比如从站的某个地址是#16 48D518645 4000118645超过了49999 这边因为前…...
趋势(一)利用python绘制折线图
趋势(一)利用python绘制折线图 折线图( Line Chart)简介 折线图用于在连续间隔或时间跨度上显示定量数值,最常用来显示趋势和关系(与其他折线组合起来)。折线图既能直观地显示数量随时间的变化…...
【含文档】基于Springboot+Vue的采购管理系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…...
【C++11入门基础】
我没有那么想你,那只是偶尔醉意会催人提起.......................................................................... 目录 前言 一、【C11的介绍】 二、【C11引入的一些实用语法】 2.1、【统一的列表初始化({ }的初始化)】 2.2、【initi…...
Pytest中fixture的scope详解
pytest作为Python技术栈下最主流的测试框架,功能极为强大和灵活。其中Fixture夹具是它的核心。而且pytest中对Fixture的作用范围也做了不同区分,能为我们利用fixture带来很好地灵活性。 下面我们就来了解下这里不同scope的作用 fixture的scope定义 首…...
Springboot 接入 WebSocket 实战
Springboot 接入 WebSocket 实战 前言: WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 简单理解: 1,常见开发过程中我们知道 Http协议,客户端…...
数据结构之红黑树的实现
红黑树的实现 1. 红⿊树的概念1.1 红⿊树的规则:1.2 思考⼀下,红⿊树如何确保最⻓路径不超过最短路径的2倍的?1.3 红⿊树的效率: 2. 红⿊树的实现2.1 红⿊树的结构2.2 红⿊树的插⼊2.2.1 红⿊树树插⼊⼀个值的⼤概过程2.2.2 情况1…...
智能工厂的设计软件 中的AI操作系统的“三维时间”(历时/共时/等时)构建的“能力成熟度-时间规模”平面
本文要点 “智能工厂的设计软件提出 “三维时间”的一个时间立方体(cube)。 “三维时间”的概念--历时diachronic(一维的)、共时synchronic(二维的)和等时isochronic(三维的)。 即…...
Spring Boot常见错误与解决方法
White graces:个人主页 🙉专栏推荐:Java入门知识🙉 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 目录 创建第一个SpringBoot项目 SpringBoot项目各个…...
Mac中安装以及配置adb环境
一、adb介绍 Android 调试桥 (Android Debug Bridge) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。adb 提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。…...
WebGL着色器语言中各个变量的作用
1、attribute变量 用于接收顶点数据,只能在顶点着色器中声明和使用。 attribute vec3 a_position; 2、uniform变量 用于在JavaScript代码中设置并在着色器程序中保持不变的值,可以在顶点着色器和片元着色器中声明和使用。但是要保证变量名唯一&#…...
Canmv k230 C++案例1——image classify学习笔记 初版
00 简介 用C编写代码的比mircopython要慢很多,需要编译开发环境,同时使用C更接近底层,效率利用率应该也是更高的,就是需要学习更多的内容,因为从零开始因此比较比较耗时。 注:以下为个人角度的理解&#x…...
vs2022 dump调试
程序中加入了捕获dump得代码,那么当程序crash时,通常可以捕获到dump文件。当然,也有一些崩溃是捕获不到的。本文就捕获到的dump文件,总结一下调试的流程。 前提:exe,pdb,dump 3者是放在同一目录…...
OpenCV高级图形用户界面(11)检查是否有键盘事件发生而不阻塞当前线程函数pollKey()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 轮询已按下的键。 函数 pollKey 无等待地轮询键盘事件。它返回已按下的键的代码或如果没有键自上次调用以来被按下则返回 -1。若要等待按键被按…...
nvm安装,node多版本管理
卸载nodejs win R 输入 appwiz.cpl 删除 node.js查看node.js安装路径是否有残留,有就删除文件夹 删除下列路径文件,一定要检查,没删干净,nvm安装会失败 C:\Program Files (x86)\NodejsC:\Program Files\NodejsC:\Users{User}\…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
