大文件分片上传进阶版(新增md5校验、上传进度展示、并行控制,智能分片、加密上传、断点续传、自动重试),实现四位一体的网络感知型大文件传输系统
上篇文章我们总结了大文件分片上传的主要核心,但是我对md5校验和上传进度展示这块也比较感兴趣,所以在deepseek的帮助下,扩展了一下我们的代码,如果有任何问题和想法,非常欢迎大家在评论区与我交流,我需要学习的地方也还有特别多~
开始之前我们先用一个通俗易懂的例子来理解我们的功能吧~
用快递寄大件包裹的思路,解释大文件分片上传的实现步骤
场景设定:
假设你要把一卡车的大米(5吨)从杭州运到北京,但遇到了几个现实问题:
1.整卡车运输风险大(爆胎就全完了)
2.中途可能有检查站需要抽检
3.运输途中网络信号时好时坏
解决方案的六个关键步骤:
第一步:货物预处理(preprocessFile)
动作:把大米分装成小袋,每袋贴上唯一编号
技术对应:
- 计算整个大米的MD5指纹(确保货物完整性)
- 生成专用加密包装袋(AES密钥)
为什么重要:
- 避免整车运输风险
- 方便中途抽检任意一袋
- 不同袋子用不同密码锁更安全
第二步:秒传核验(checkInstantUpload)
动作:打电话给北京仓库:“你们已经有5吨杭州大米了吗?”
技术对应:
- 发送MD5给服务端查询
- 如果已有相同货物,直接标记运输完成
省时技巧:
- 避免重复运输相同货物
- 节省90%运输时间
第三步:智能分箱(prepareChunks)
动作:根据路况决定每箱装多少袋
- 高速公路:用大箱子(装20袋)
- 山路:用小箱子(装5袋)
技术对应:
- 网络测速(检查"路况")
- 动态调整分片大小
智慧之处:
- 好路况多装快跑
- 差路况少装稳走
第四步:分批运输(uploadAllChunks)
动作:
- 给每个箱子单独上锁(不同IV加密)
- 3辆货车同时出发(并发控制)
- 某辆车抛锚就换车重发(错误重试)
技术细节:
- 每个分片独立加密
- 失败分片自动重试3次
- 实时记录已送达的箱子
第五步:收件核验(mergeFile)
动作:
- 北京仓库收到所有箱子
- 按编号顺序拆箱组合
- 检查MD5是否匹配原始指纹
安全保障:
- 防止运输途中被调包
- 确保颗粒不少
第六步:断点续传(saveProgress)
突发情况处理:
- 遇到暴雨暂停运输
- 记录哪些箱子已送达
- 雨停后继续送未达的箱子
技术实现:
- 自动保存上传进度
- 支持从断点恢复
我们的智能方案为什么更优秀呢?
1.整车上路风险高,
化整为零
更安全
2.每袋都有独立指纹
和密码锁
,防止被掉包
3.根据路况调整运输策略
,堵车时不用干等
4.遇到检查要全部开箱时,可随机抽捡
一袋不影响整体
5.重新发货不用从头开始,断点续传
省时省力
所以我们其实是在上一篇大文件分片上传的过程中增加了两个功能:
秒传检查和合并校验
整体步骤是:
预处理->秒传检查->智能分片->加密运输->合并校验->断点保护
学习之前我们先来搞懂两个问题:
1.md5校验在我们文件上传过程中是必须的吗?
答案肯定是否,但有两个场景我们是必须要使用md5校验的(大方向):秒传功能
与文件完整性
场景 | 类比解释 | 技术对应 |
---|---|---|
秒传功能 | 仓库发现已有同批次芒果,直接调库 | 服务端比对MD5跳过上传 |
防数据篡改 | 发现运输商偷换成越南芒果 | 合并后MD5与原始值比对 |
如果简单使用文件大小校验
,或者严重依赖tpc传输
确保文件不会丢失的情况下也是可以不使用md5校验的
2.md5校验与分片加密有什么关系?可以替代吗?
即使我们已经对每个分片进行了加密上传,仍然可以使用md5校验文件的完整性,分片加密与md5校验是互补而非替代
。分片加密如同在生产线上为每个零件做防锈处理,而MD5校验如同在出厂前对整机进行质检——防锈处理不能替代最终质检,两者结合才能确保交付可靠的产品。
- 分片加密的作用
加密阶段 | 防护目标 | 示例风险 |
---|---|---|
传输过程加密 | 防中间人窃听/篡改 | 黑客截获分片并修改 |
存储加密 | 防服务器数据泄露 | 数据库被拖库 |
- MD5校验的核心价值
校验场景 | 解决的问题 | 示例风险 |
---|---|---|
加密前校验 | 源文件完整性 | 本地文件损坏 |
解密后校验 | 解密过程是否正确 | 密钥错误导致解密失败 |
合并校验 | 分片顺序/组合错误 | 分片序号错乱 |
所以如果(验证文件完整性中可能会发生的错误)
1.加密前的源文件已经损坏(加密传输后肯定有误)
2.密钥错误、IV丢失、解密算法不兼容等导致解密后数据错误
3.分片上传成功但合并顺序错乱
以上几种情况发生的时候我们是有必要进行md5校验的
首先看我们需要实现功能的完整思路与技术亮点吧~
完整实现思路(五阶段工作流)
1.初始化阶段
- 生成文件唯一ID(UUID v4)
- 配置分片大小范围(默认1MB~20MB)
- 初始化加密系统、分片存储结构
2.预处理阶段
- 并行执行:MD5计算 + 密钥生成(加速启动)
- 流式MD5:2MB分片渐进计算,避免内存溢出
- 密钥管理:使用Web Crypto API安全生成AES密钥
3.秒传校验
- 发送文件MD5到服务端查询
- 存在相同文件时直接跳过后续步骤
- 节省带宽和服务器存储空间
4.动态分片上传
- 网络测速:通过1MB测试文件探测当前带宽
- 智能分片:按带宽50%动态调整分片大小
- 加密传输:每个分片独立IV,AES-CBC加密
- 并发控制:3个并行上传通道(可配置)
- 重试机制:指数退避策略(2s, 4s, 8s)
5.收尾工作
- 发送合并请求到服务端
- 清理临时数据(可选)
- 持久化最终状态
架构亮点
网络自适应
- 三次测速取平均值减少误差
- 分片大小平滑过渡(避免剧烈波动)
安全传输
- 前端加密 + 服务端解密双保险
- 每个分片独立IV防止模式分析
- 密钥仅存于内存和加密存储
可靠性保障
- 断点续传:自动保存进度到IndexedDB
- 原子操作:分片上传成功后才标记完成
- 错误隔离:单个分片失败不影响整体流程
性能优化
- 并行预处理(MD5和密钥生成)
- 流式哈希计算(内存占用恒定)
- 浏览器空闲时段上传(可扩展)
以下是完整代码
/*** 四位一体的网络感知型大文件传输系统* * 动态分片策略
// 基于实时网络带宽的动态分片算法(1MB~20MB智能调节)
// 分片大小平滑调整机制(20%最大波动限制)
// 内存对齐优化(1MB粒度减少资源碎片)* 数据安全框架
// 三级校验体系:全文件MD5 + 分片级SHA256双哈希
// AES-CBC加密(分片独立IV防重放攻击)
// 密钥生命周期管理(生成->存储->使用隔离)* 传输可靠性保障
// 断点续传能力(IndexedDB持久化存储)
// 异常安全边界(try-catch包裹全流程)
// 分片原子化操作(独立元数据管理)* 性能优化工程
// 并行预处理流水线(MD5与密钥并行计算)
// 流式哈希计算(2MB分片递归处理)
// 网络测速基准(1MB测试包探测带宽)*//*** 大文件分片上传类(支持动态分片、加密、MD5校验)*/
class FileUploader {/*** 初始化上传实例* @param {File} file - 浏览器文件对象 * @param {Object} [options] - 配置参数*/constructor(file, options = {}) {// 必需参数this.file = file; // 上传文件对象this.fileId = this.generateFileId(); // 文件唯一标识this.fileMD5 = null; // 全文件MD5值// 分片管理this.chunks = []; // 全部分片数据this.uploadedChunks = new Set(); // 已上传分片索引this.ivMap = new Map(); // 加密初始化向量存储,存储每个分片的IV// 加密配置this.encryptionKey = null; // AES加密密钥// 性能参数this.lastUploadSpeed = 5 * 1024 * 1024; // 网络基准速度(默认5MB/s)// 用户配置this.options = {minChunkSize: 1 * 1024 * 1024, // 最小分片1MBmaxChunkSize: 20 * 1024 * 1024, // 最大分片20MB...options};// 事件系统this.events = {};}// --------------------------// 核心公共方法// --------------------------/*** 启动上传流程(完整工作流)* * @throws {Error} 上传过程中的错误*/async startUpload() {try {// 阶段1: 文件预处理(计算哈希 + 生成密钥)await this.preprocessFile();// 阶段2: 秒传检查(通过文件MD5判断是否需要传输)const needUpload = await this.checkInstantUpload();if (!needUpload) return;// 阶段3: 动态分片准备(根据网络状况生成分片)await this.prepareChunks();// 阶段4: 分片上传(含加密和重试机制)await this.uploadAllChunks();// 阶段5: 合并请求await this.mergeFile();this.emit('complete');} catch (error) {console.error('上传流程异常:', error);await this.saveProgress(); // 异常时保存进度this.emit('error', error);throw error;}}// --------------------------// 预处理阶段(含MD5计算)// --------------------------/*** 阶段1:文件预处理(计算MD5、生成密钥)*/async preprocessFile() {// 并行执行两个任务,实现异步流水线加速// SparkMD5库保障哈希计算准确性// Web Crypto API生成符合FIPS标准的AES密钥const [md5, key] = await Promise.all([this.calculateFileMD5(), // 计算全文件MD5this.generateAESKey() // 生成加密密钥]);this.fileMD5 = md5;this.encryptionKey = key;// 保存初始进度(可用于恢复)await this.saveProgress();}/*** 计算全文件MD5(分片计算避免内存溢出)* @returns {Promise<string>} MD5哈希值*/calculateFileMD5() {// 返回Promise对象实现异步计算流程控制return new Promise((resolve) => {// 定义分片大小(2MB兼顾计算效率与内存安全)const chunkSize = 2 * 1024 * 1024;// 计算总切片数量(向上取整保证最后分片完整性)const chunks = Math.ceil(this.file.size / chunkSize);// 初始化SparkMD5实例(专为ArrayBuffer优化的MD5计算库)const spark = new SparkMD5.ArrayBuffer();// 已处理分片计数器let processed = 0;// 定义分片加载递归函数,递归分片处理大文件(2MB粒度),避免内存溢出风险const loadNext = () => {// 计算当前分片字节范围const start = processed * chunkSize;const end = Math.min(start + chunkSize, this.file.size);// 切割文件对象获取当前分片Blobconst blob = this.file.slice(start, end);// 创建文件读取器处理二进制数据const reader = new FileReader();// 注册文件加载完成回调reader.onload = (e) => {// 将分片二进制数据追加到MD5计算流spark.append(e.target.result);// 更新已处理分片计数processed++;// 存储计算进度(格式:当前分片/总分片数)sessionStorage.setItem(`${this.fileId}_md5`, `${processed}/${chunks}`);// 触发进度事件this.emit('progress', {type: 'md5',value: processed / chunks});// 递归判断:未完成继续处理,完成则返回最终MD5processed < chunks ? loadNext() : resolve(spark.end());};// 启动分片数据读取(ArrayBuffer格式保持二进制精度)reader.readAsArrayBuffer(blob);};// 启动首个分片处理loadNext();});}/*** 阶段2:秒传验证(checkInstantUpload)* 实现逻辑: 将全文件MD5发送至服务端查询,若存在相同哈希文件,触发秒传逻辑,跳过后续流程直接返回成功* 业务价值:节省90%+重复文件传输成本;降低服务器存储冗余*//*** 🌟 秒传验证核心方法* @param {string} fileMD5 - 文件的完整MD5哈希值* @returns {Promise<boolean>} - 是否可秒传*/async checkInstantUpload(fileMD5) {try {const response = await fetch('/api/check-instant-upload', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ md5: fileMD5 })});if (!response.ok) throw new Error('秒传验证请求失败');const result = await response.json();return result.exists; // 服务端返回是否存在} catch (error) {console.error('秒传验证异常:', error);return false; // 失败时按需处理,此处默认继续上传}}// --------------------------// 分片处理阶段(含动态调整)// --------------------------/*** 阶段3:智能分片准备(动态调整分片大小)* 算法原理:基于实时测速结果(testNetworkSpeed)计算基准值引入历史速度惯性因子(lastUploadSpeed)平滑波动内存对齐优化提升分片处理效率*/async prepareChunks() {// 网络测速(取三次平均值)const speeds = [];for (let i = 0; i < 3; i++) {speeds.push(await this.testNetworkSpeed());}const currentSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.length;// 计算动态分片大小(控制在配置范围内)let chunkSize = currentSpeed * 0.5; // 按带宽50%计算chunkSize = Math.max(this.options.minChunkSize,Math.min(this.options.maxChunkSize, chunkSize));// 生成分片元数据const totalChunks = Math.ceil(this.file.size / chunkSize);for (let i = 0; i < totalChunks; i++) {const start = i * chunkSize;const end = Math.min(start + chunkSize, this.file.size);this.chunks.push({index: i,blob: this.file.slice(start, end),size: end - start});}}
}/*** 阶段4:分片上传(uploadAllChunks)(并发控制 + 重试机制)* 加密流程生成随机IV(每个分片独立初始化向量)计算原始数据SHA256哈希AES-CBC加密分片数据生成加密后哈希(可选二次校验)* 传输策略Set数据结构记录已上传分片索引失败重试机制(需补充实现)并行上传控制(可扩展为连接池管理*/async uploadAllChunks() {// 设置并发数:浏览器环境下建议2-4个并行请求,平衡性能与稳定性const CONCURRENCY = 3;// 创建上传队列:通过展开运算符复制分片数组,避免直接操作原始数据const queue = [...this.chunks];// 主循环:持续处理直到队列清空while (queue.length > 0) {// 初始化当前批次的Promise容器const workers = [];// 提取当前批任务:每次取出CONCURRENCY数量的分片// splice操作会同时修改队列长度,实现队列动态缩减const currentBatch = queue.splice(0, CONCURRENCY);// 遍历当前批次的分片for (const chunk of currentBatch) {// 跳过已上传分片:通过Set检查避免重复上传if (this.uploadedChunks.has(chunk.index)) continue;// 将分片上传任务包装成Promise,加入workers数组workers.push(// 执行分片上传核心方法this.uploadChunk(chunk, chunk.index).then(() => {// 计算实时进度:已上传数 / 总分片数const progress = this.uploadedChunks.size / this.chunks.length;// 触发进度事件:通知外部监听者更新进度条this.emit('progress', { type: 'upload', value: progress });}));}// 等待当前批次全部完成(无论成功/失败)// 使用allSettled而非all保证异常不会中断整个上传流程await Promise.allSettled(workers);}
}/*** 单分片上传(含加密和重试机制)* @param {Object} chunk - 分片数据* @param {number} index - 分片索引* @param {number} retries - 剩余重试次数*/async uploadChunk(chunk, index, retries = 3) {try {// 加密处理(生成独立IV)const encryptedBlob = await this.encryptChunk(chunk.blob, index);// 构建表单数据const formData = new FormData();formData.append('file', encryptedBlob);formData.append('index', index);formData.append('iv', this.ivMap.get(index));// 上传请求const response = await fetch('/upload', {method: 'POST',body: formData});if (!response.ok) throw new Error(`HTTP ${response.status}`);this.uploadedChunks.add(index);} catch (error) {if (retries > 0) {await new Promise(r => setTimeout(r, 2000 * (4 - retries))); // 指数退避return this.uploadChunk(chunk, index, retries - 1);}throw new Error(`分片${index}上传失败: ${error.message}`);}
}/* ================= 加密模块 ================= *//** 生成AES-CBC加密密钥 */async generateAESKey() {return crypto.subtle.generateKey({ name: 'AES-CBC', length: 256 },true,['encrypt', 'decrypt']);
}/** 加密单个分片 */async encryptChunk(blob, index) {const iv = crypto.getRandomValues(new Uint8Array(16));const data = await blob.arrayBuffer();// 原始数据哈希校验const rawHash = await crypto.subtle.digest('SHA-256', data);// 执行加密const encrypted = await crypto.subtle.encrypt({ name: 'AES-CBC', iv },this.encryptionKey,data);// 存储加密参数this.ivMap.set(index, iv);return new Blob([encrypted], { type: 'application/octet-stream' });
}/* ================= 辅助方法 ================= *//** 网络测速(上传1MB测试文件) */async testNetworkSpeed() {const testBlob = new Blob([new Uint8Array(1 * 1024 * 1024)]);const start = Date.now();await fetch('/speed-test', {method: 'POST',body: testBlob});const duration = (Date.now() - start) / 1000;return (1 * 1024 * 1024) / duration; // 返回字节/秒
}/** 持久化上传进度 */async saveProgress() {const data = {fileId: this.fileId,chunks: this.chunks,uploadedChunks: [...this.uploadedChunks],encryptionKey: await crypto.subtle.exportKey('jwk', this.encryptionKey),ivMap: Object.fromEntries(this.ivMap)};await idb.setItem(this.fileId, data); // 假设使用IndexedDB
}/** 生成文件唯一ID */
generateFileId() {return crypto.randomUUID();
}/* ================= 事件系统 ================= */on(event, callback) {this.events[event] = callback;return this;
}emit(event, ...args) {const handler = this.events[event];handler && handler(...args);
}
}// ---------------------------- 使用示例 ----------------------------
const uploader = new FileUploader(file, {maxChunkSize: 50 * 1024 * 1024 // 自定义配置
});// 事件监听
uploader.on('progress', ({ type, value }) => {console.log(`${type}进度: ${(value * 100).toFixed(1)}%`);}).on('error', error => {console.error('上传失败:', error);});// 启动上传
uploader.startUpload();
相关文章:
大文件分片上传进阶版(新增md5校验、上传进度展示、并行控制,智能分片、加密上传、断点续传、自动重试),实现四位一体的网络感知型大文件传输系统
上篇文章我们总结了大文件分片上传的主要核心,但是我对md5校验和上传进度展示这块也比较感兴趣,所以在deepseek的帮助下,扩展了一下我们的代码,如果有任何问题和想法,非常欢迎大家在评论区与我交流,我需要学…...
【项目管理】成本类计算 笔记
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应&…...
Redis 事务
事务介绍 Redis 事务和 MySQL 事务在概念上类似的 把一些列的操作绑定成一组,让这一组能够批量执行 MySQL 事务 原子性:把多个操作打包成一个整体 一致性:事务执行前后数据合理 持久性:事务做出的操作都会修改硬盘 隔离性&#…...
JavaScript day5
立即执行函数 <script>(function(){ console.log//函数不需调用,立马执行 })() </script> //另外写法 <script> (function(){}()) </script> 常见的内置对象 Math console.dir()——打印对象的 使用Math中的属性——console.log(Math.…...
辛格迪客户案例 | 浙江高跖医药委托生产质量管理协同(OWL MAH)项目
一、案例概述 浙江高跖医药科技股份有限公司是一家集“研、产、销”为一体的专业化药品持证企业。高跖医药自成立之初就建立并运行着一套相对完善的质量管理体系,涵盖了药品的研发、生产监管及销售。高跖医药于2022年选择实施了辛格迪的“委托生产质量管理协同解决…...
科学养生指南:解锁健康生活新方式
在快节奏的现代生活中,健康养生已成为人们关注的焦点。科学合理的养生方式,能帮助我们增强体质、预防疾病,享受更优质的生活。 饮食是健康养生的基石。遵循 “均衡饮食” 原则,每日饮食需包含谷类、蔬菜水果、优质蛋白质和健康…...
FreeRTos学习记录--2.内存管理
后续的章节涉及这些内核对象:task、queue、semaphores和event group等。为了让FreeRTOS更容易使用,这些内核对象一般都是动态分配:用到时分配,不使用时释放。使用内存的动态管理功能,简化了程序设计:不再需…...
C++ 操作符重载Operator
C可以重载大多数操作符,如算术运算符号,-号。 位操作符<<,>> 下标符号[]等都可以重载。 重载的意思,是让这些符号,按你定义的行为来执行代码,但是这种自定义,是有限制的,必须有一…...
SBTI科学碳目标认证有什么要求?SBTI认证的好处?
SBTi(科学碳目标倡议)认证要求与好处 SBTi(Science Based Targets initiative,科学碳目标倡议)是由全球环境信息研究中心(CDP)、联合国全球契约(UNGC)、世界资源研究所&…...
RS232转Profibus DP网关:技术革新!
RS232转Profibus DP网关:技术革新! 在工业自动化领域,通讯协议的多样性为系统设计提供了灵活性,但同时也带来了不同设备间通信的挑战。其中,RS232和Profibus DP是两种广泛应用的通讯协议。RS232,作为一种串…...
XAML基本语法与例子
XAML (eXtensible Application Markup Language) 是一种基于 XML 的声明性语言,主要用于 WPF、UWP、Xamarin.Forms 和 MAUI 等框架中构建用户界面。 基本语法结构 1. 根元素和命名空间声明 <Page x:Class"MyNamespace.MyPage"xmlns"http://sch…...
map和set封装
创作中心-CSDNhttps://mpbeta.csdn.net/mp_blog/creation/editor/147238663 目录 创作中心-CSDNhttps://mpbeta.csdn.net/mp_blog/creation/editor/147238663 一、封装原理 二、改造红黑树 三、实现迭代器 四、测试 五、小tip 一、封装原理 上一篇文章我们完成了红黑…...
Java第六节:创建线程的其它三种方式(附带源代码)
作者往期文章 Java第五节:继承thread类创建线程-CSDN博客 一、实现Runnable接口 创建一个Thread02类实现Runnable接口 二、使用匿名内部类 在Main函数中匿名内部类创建线程 三、使用Lambda表达式 在Main函数中利用Lambda表达式创建一个线程 四、源代码 此项目源代…...
041-代码味道-大泥团模块
代码味道-大泥团模块 代码味道-Blob Module深度解析与C重构实践 一、Blob Module定义与特征 Blob Module(大泥团模块)是代码坏味道中的一种典型表现,指某个类或模块承担了过多不相关的职责,导致代码结构臃肿、可维护性差。其核心…...
强化学习系统学习路径与实践方法
一、学习路径规划 1. 基础巩固阶段(1-2个月) 必读教材: 《Reinforcement Learning: An Introduction》(Sutton & Barto) 第1-6章重点掌握:马尔可夫决策过程(MDP)、贝尔曼…...
CSS字体
CSS字体 CSS 中的字体样式设置是网页设计的重要部分,以下是一些关键知识点和常见用法: 1.font-family : 用于设置元素的字体系列。可以指定一个或多个字体名称作为备选项,以确保如果某个字体不可用,可以使用下一个备选…...
JDBC:数据库访问的原始接口
目录 一、JDBC 基础入门:数据库访问的原始接口 JDBC 是什么?它在 Java 中扮演什么角色? JDBC 工作原理图解(驱动 -> 连接 -> 执行 -> 关闭) 常见 JDBC 驱动类型及差异 第一个 JDBC 示例程序:连…...
使用 Electron 打包可执行文件和资源:完整实战教程
一.项目结构 项目结构建议如下: my-electron-app/ ├── example.exe ← 需打包的外部程序 ├── config.json ← 配置文件 ├── native-lib/ ← 自定义库或 DLL │ └── yourlib.dll ├── main.js …...
【网络安全】CI/CD 流水线漏洞
【网络安全】CI/CD 流水线漏洞 1. 保护您的软件管道:CI/CD 安全2. 什么是 CI/CD 以及它为何重要?2.1 持续集成(CI):构建坚实的基础2.2 持续交付(CD):准备发布2.3 持续部署࿰…...
计算机是如何工作的(上)
对于学习JavaEE初阶为什么要知道计算机是如何工作的,是因为在未来我们写代码的时候,会出现一些bug,而在代码层面是看不出来的,所以我们需要了解一些关于计算机内部是如何工作的,从而提高代码的健壮度。 计算机的组成&…...
【SF顺丰】顺丰开放平台API对接(Java对接篇)
对接前置篇: 【SF顺丰】顺丰开放平台API对接(注册、API测试篇)_顺丰api接口对接指南-CSDN博客 1.实现效果展示 2.SF顺丰开放平台,JDK资源下载。 下载地址:顺丰开放平台 3.将下载的JDK放入项目中。 4.将JDK资源引入p…...
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试 1. 概述2. 压测环境部署3. 生成测试数据4. 写入性能测试5. 查询性能测试7. 总结 1. 概述 KWDB是一款主要应用于工业物联网、数字能源、车联网、智慧产业等领域的时序数据库ÿ…...
24.中医知识问答删除历史对话功能前端代码实现
前端实现对话删除功能的完整指南 功能概述 前篇文章介绍了删除历史对话的后端开发,本篇将介绍如何在前端实现一个完整的对话删除功能,包括用户确认、API调用、状态管理和错误处理等关键环节。 功能拆解 1. 用户确认机制 javascript const confirmDe…...
在Cursor编辑器上部署MCP(Minecraft Coder Pack)完整指南
MCP(Minecraft Coder Pack)是用于反编译和修改Minecraft Java版代码的工具包。本教程将详细介绍如何在Cursor编辑器中配置和运行MCP,以便高效地进行Minecraft模组开发或代码研究。 1. 准备工作 1.1 所需工具 Cursor编辑器(基于VS…...
STM32——相关软件安装
本文是根据江协科技提供的教学视频所写,旨在便于日后复习,同时供学习嵌入式的朋友们参考,文中涉及到的所有资料也均来源于江协科技(资料下载)。 Keil5 MDK安装 1.安装Keil5 MDK2.安装器件支持包方法一:离线…...
蓝牙WiFi模组rtl8821cs在Android14调
环境 SDK: AOSP14 主控:RK3576 蓝牙:RTL8821CS 先记一下官网文档关于蓝牙的资料 蓝牙 | Android Open Source Project 还在调,先看看啥情况,点赞多或者想起来记录再回来 TODO...
MCP实践第一步--磕磕碰碰搭环境
由于deepseek-r1不支持function calling,所以我们采用了deepseek-v3进行实践,模型名称为deepseek-chat,在deepseek官网获取api-key。 一、参照MCP官网设置环境 创建项目目录 uv init mcp-client # 若没有uv,则先通过pip instal…...
Java并发:线程池
目录 一、核心概念与设计原理 1、线程池的核心价值 2、核心接口和类 3、线程池的核心构造参数 4、线程池工作流程 二、参数选择 1、任务队列选择 2、拒绝策略选择 3、常见线程池选择 4、参数调优 三、 应用 1、创建建议 2、生命周期管理:优雅关闭 3、…...
Kubernetes集群超配节点容量
目录: 1、节点超配简介2、创建 PriorityClass3、运行请求节点容量的 Pod4、调整占位资源请求5、设置所需的副本数量6、自动扩缩容组件6.1、手动方式6.2、自动方式 1、节点超配简介 节点超配是一种主动预留部分集群计算资源的策略。这种预留有助于减少在扩缩容事件期…...
每日一题(小白)回溯篇7
首先我们可以判断出这是一个dfs的题目,因为简言之就是要求最短路径。其次这个题目与直接找最短路径有所不同,增加了条件必须依次穿过指定的符号。无论坦克走到任何一点都有四个方向可以走(越界要判断),结束的条件是到达…...
rk3588上完成halcon的形状模型配准以及和opencv的图像转换
一、准备工作 1)安装好halcon,确保halcon的c的调用是正常的 2)编译好opencv 上面的两个步骤,均可以参考我的两个博文完成: Halcon在linux及ARM上的安装及c工程化_halcon linux-CSDN博客 RK3588上编译opencv 及基于…...
Spring Boot 断点续传实战:大文件上传不再怕网络中断
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、痛点与挑战 在网络传输大文件(如视频、数据集、设计稿)时,常面临: 上传中途网络中断需重新开始服务器内…...
Springboot集成websocket实现消息推送
假设有个需求需要多个用户同时在对应的消息面板实时查看相关接口的执行流程进度,此时可以可考虑使用websocket来实现结果进度推送 一、引入websocket依赖,并编写WebSocket配置类 <dependency><groupId>org.springframework.boot</group…...
PostgreSQL 用户资源管理
PostgreSQL 用户资源管理 PostgreSQL 提供了多种机制来管理和限制用户对数据库资源的使用,以下是全面的资源管理方法: 1 连接限制 1.1 限制最大连接数 -- 在 postgresql.conf 中设置 max_connections 100 -- 全局最大连接数-- 为特定用户设置连接限…...
Uniapp:pages.json页面路由
目录 一、pages二、style 一、pages uni-app 通过 pages 节点配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象,其属性值如下: 属性类型默认值描述pathString配置页面路径styleObject配置页面窗口表现nee…...
使用open3d将pcd点云按照颜色等级分块显示并令其随颜色变化播放
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! 使用open3d将pcd点云按照颜色等级分块显示并令其随颜色变化播放 引言显示效果点云获取完整代码引言 有很多时候我们需要更改pcd点云某些区域的颜色,可能是颜色随着点…...
玩转Docker | 使用Docker部署nullboard任务管理工具
玩转Docker | 使用Docker部署nullboard任务管理工具 前言一、nullboard介绍简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署nullboard服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问nullboard服务访问nullboard首页五…...
如何避免流程形式化导致的效率低下?
要避免流程形式化导致的效率低下,核心在于:聚焦流程价值、保障执行灵活性、优化流程设计、建立反馈机制、提升执行感知。其中,聚焦流程价值 是解决流程“空转”的首要原则。流程不应只是文档或制度的堆叠,而要服务于业务目标&…...
Java学习手册:HTTP 协议基础知识
一、HTTP 协议概述 HTTP(HyperText Transfer Protocol)即超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传输协议。它是一个应用层协议,基于请求-响应模型…...
基于多模态融合算法的航空武器毁伤评估技术方案
基于多模态融合算法的航空武器毁伤评估技术方案 1. 引言 航空武器毁伤评估(Damage Assessment, DA)是现代战争中的关键环节,直接影响后续作战决策。传统的人工评估方式效率低、主观性强,且在高强度战场环境下难以实时完成。因此,本研究提出一种基于多模态融合算法的自动…...
欧拉-国产操作系统替代产品如何
欧拉(openEuler)国产操作系统是由华为发起并联合开源社区共同开发的企业级操作系统,旨在构建自主可控的数字基础设施生态底座。以下从开发背景、技术特点、应用场景、生态建设及市场表现等方面进行全面介绍: 一、开发背景与战略定位 国家需求驱动 在中美技术竞争背景下,国…...
入门-C编程基础部分:16、 预处理器
飞书文档https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf C 预处理是编译过程中一个单独的步骤,是一个文本替换工具而已。所有的预处理命令都是以井号(#)开头。 指令描述#define定义宏#ifdef如果宏已经定义,则返…...
Spark-SQL4
一 .Spark-SQL核心编程(六) Spark-SQL连接Hive Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL 编译时可以包含 Hive 支持,也可以不包含。包含 Hive 支持的 Spark SQL 可以支持 Hive 表访问、UDF (用户自定义函数)、Hive 查询语…...
模数转换【1】AD7699
1.开发背景 一款可以模数转换芯片,兼容通用 SPI 接口,支持最多支持 8 个通道和 500KSPS 的采样率。支持单个通道采集和扫描采集模式。 同系列的芯片还有 AD7682 和 AD7689 等。 2.开发需求 配置内部参考电压4.096V,实现单个通道采集和扫描采集…...
P5670 秘籍-反复异或 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an) 和常数 m m m,有 q q q 个操作分两种: add ( l , r , x ) \operatorname{add}(l,r,x) add(l,r,x):对每个 i ∈ [ l , r ] i\in[l,r] …...
PID控制程序编写
目录 一、C语言PID控制器示例代码 二、代码解释 三、重要注意事项 一、C语言PID控制器示例代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> // For sleep function typedef struct { double Kp; // 比例增益 double…...
推荐系统/业务,相关知识/概念2
一、漫画库更新大量新作品,如何融入推荐系统? 参考答案: 快速提取新作品特征:除基础属性外,利用自然语言处理技术提取漫画简介关键词等丰富特征向量,分析情节、角色设定等深层次特征结合物品画像体系分类…...
基于Python的施工图与竣工图对比小工具开发方案
基于Python的施工图与竣工图对比小工具开发方案 一、引言 在工程建设领域,施工图与竣工图的对比是项目验收的关键环节。传统人工对比方式效率低、易出错,本文基于Python开发一款自动化对比工具,支持快速检测图纸差异并生成可视化报告&#x…...
2025年世界职业院校技能大赛实施方案(意见稿)
为贯彻落实《教育强国建设规划纲要(2024—2035年)》,进一步提升世界职业院校技能大赛(以下简称“大赛”)内涵质量,发挥大赛引领作用,提升高技能人才培养质量,服务现代职业教育体系建…...
辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目
一、案例概述 富士莱医药股份有限公司位于美丽的江南水乡常熟,前身为常熟富士莱医药化工有限公司,从建厂初期面积仅有10余亩,逐步扩展到100余亩。近年来公司飞速发展,以黑马姿态发展成为中国专业生产硫辛酸系列产品、肌肽系列产品…...