断点续传(全栈)
📅 2026/7/12 5:08:33
👁️ 次浏览
断点续传的核心思路是不要把整个大文件一次性传完而是切成很多小块每块单独上传服务器记住“哪些块已经收到了”断了以后只补传缺的块。下面按你项目里的实现把完整过程讲一遍。一、为什么原来不行你原来的接口是这样的也就是一次 POST把整个文件塞进FormData。问题在于传 2GB 文件可能要几分钟中途网络断了、浏览器关了、服务器超时了 → 这次上传全作废只能从头再来所以断点续传必须改成 “分片 记录进度 最后合并”。二、整体流程3 步sequenceDiagram participant 浏览器 participant 后端 participant 磁盘 浏览器-浏览器: 1. 选文件生成 uploadId 浏览器-后端: 2. GET /status查已传分片 后端-磁盘: 看 .chunks/uploadId/ 里有哪些分片 后端--浏览器: 返回 [0,1,2] 已上传 loop 每个缺失分片 浏览器-后端: 3. POST /chunk传一块 5MB 后端-磁盘: 保存为 0、1、2... end 浏览器-后端: 4. POST /merge合并 后端-磁盘: 按顺序拼成完整文件 后端-磁盘: 删除临时分片 后端-数据库: 写入 FileTwo 记录 后端--浏览器: 上传成功可以把它理解成先问服务器“我传到哪了” → 只传没传完的 → 全部齐了再拼成完整文件三、前端做了什么1. 给每个文件生成唯一 IDuploadId// 用「文件名 大小 最后修改时间」算 SHA-256 const raw ${file.name}|${file.size}|${file.lastModified}; const digest await crypto.subtle.digest(SHA-256, ...);作用同一个文件不管今天传还是明天传uploadId都一样。服务器就能认出“这是同一次上传任务”。注意不是按文件内容 hash而是按元信息。内容变了但名字/大小/时间不变会当成同一次上传。对你这个场景一般够用。2. 把文件切成 5MB 一片const CHUNK_SIZE 5 * 1024 * 1024; // 5MB const totalChunks Math.ceil(file.size / CHUNK_SIZE);例如 23MB 文件 → 5 片[0,1,2,3,4]。用file.slice(start, end)从本地文件里切出每一块不用把整个文件读进内存。3. 先查状态断点的关键GET /duandianxuchuan/status?uploadIdxxxtotalChunks5 → 返回 data: [0, 1, 2] // 表示 0、1、2 已经传过了前端用Set存已传分片上传时for (let i 0; i totalChunks; i) { if (!uploadedChunks.has(i)) { // 只传缺失的分片 await uploadChunk(uploadId, i, file.slice(...)); } }这就是“断点续传”传到一半断了 → 重新选同一个文件 → status 告诉你 0、1、2 已有 → 只传 3、4。4. 全部传完后请求合并POST /duandianxuchuan/merge uploadId, fileName, totalChunks, folderId合并成功后文件才真正出现在文件列表里。5. 进度条怎么来的每传完一片就算一下percent (chunkIndex 1) / totalChunks * 100所以进度是按分片数量走的不是精确字节级但体验上够用。四、后端做了什么1. 临时分片存哪/opt/resource/file/hls2/.chunks/{uploadId}/ ├── 0 ← 第 0 片 ├── 1 ← 第 1 片 ├── 2 └── ...uploadId会先做安全校验防止路径穿越。2. status 接口遍历0到totalChunks-1看对应文件是否存在存在就加入uploaded列表返回。3. chunk 接口收到一片后Path chunkPath chunkDir.resolve(String.valueOf(chunkIndex)); if (!Files.exists(chunkPath)) { Files.copy(chunk.getInputStream(), chunkPath); }已存在就跳过 → 同一片重复传也不会出错幂等。4. merge 接口最关键检查0 ~ totalChunks-1是否都在按顺序写入最终文件try (OutputStream out Files.newOutputStream(fileSavePath)) { for (int i 0; i totalChunks; i) { Files.copy(chunkDir.resolve(String.valueOf(i)), out); } }删除.chunks/{uploadId}/临时目录像原来一样写入FileTwo表文件名、路径、大小、folderId 等五、举个具体例子假设你要传一个 12MB 的课件.pdf步骤发生了什么1浏览器算出uploadId a1b2c3...2切成 3 片0(5MB)、1(5MB)、2(2MB)3传完 0、1 后网络断了4你重新选课件.pdf上传5status 返回[0, 1]6只传分片 27merge → 生成/opt/resource/file/hls2/课件.pdf8数据库多一条记录页面刷新后能看到六、和原来接口的对比原来upload_file现在断点续传传法一次传整个文件5MB 一片一片传断了怎么办从头来接着传接口数量1 个3 个status / chunk / merge服务器临时文件无.chunks/目录入库时机传完即入库merge 成功后才入库七、几个细节多文件前端是逐个文件走完整流程每个文件有自己的uploadId。分片大小前后端都是 5MB必须一致。“已存在”检查在 merge 时做不是 chunk 时做。临时分片清理merge 成功后会删如果 merge 前一直失败.chunks会留着方便下次续传也可以以后加定时清理。八、一句话总结前端切片 后端按片存 查进度跳过已传 最后合并入库如果你愿意我还可以单独画一张「用户点上传按钮后浏览器内部函数怎么一层层调用」的流程图或者讲「如果 merge 时少了一片会怎么办」。
1. 项目概述:为什么MMORPG服务器需要独立的物理模拟?做MMORPG(大型多人在线角色扮演游戏)的服务器开发,很多刚入行的朋友可能会觉得,物理模拟不就是Unity客户端里挂个Rigidbody和Collider的事儿吗ÿ…
📅 2026/7/12 5:08:33
说实话,看到网上那些吹得天花乱坠的软文,我差点就信了。直到我自己花了一周时间,把所谓的“神器”openclaw应用 折腾了个遍,才敢来跟大伙儿掏心窝子说几句真话。这玩意儿不是万能药,但也绝对不是纯纯的智商税,关键看你怎么用。先说个真实案例。我有个做跨境电商的朋友,之…
📅 2026/7/12 5:07:30
1. 项目概述:从静态场景到可交互的VR世界作为一个在游戏开发领域摸爬滚打了多年的老鸟,我最近终于下定决心,要把一直想尝试的VR项目给落地了。项目标题“从模型摆放到动态交互:我的第一个UnityVR工程场景避坑实录”基本概括了我这…
📅 2026/7/12 5:07:33
1. 项目概述:为什么用C构建推荐系统?在推荐系统这个领域,你可能会听到很多关于Python、Java甚至Go的讨论,但今天我想聊聊一个“老而弥坚”的选择:C。当项目标题是“手把手教你用C构建推荐系统,工业级项目落…
📅 2026/7/12 7:06:11
Windchill 13 工程变更管理实战:从 PR 到 ECA 的 4 步闭环流程与 3 个关键控制点在制造业产品生命周期管理(PLM)中,工程变更管理(ECM)是确保产品质量与合规性的核心环节。Windchill 13 作为 PTC 新一代 PLM…
📅 2026/7/12 7:06:11
HDFS Shell 命令效率对比:hadoop fs vs hdfs dfs 在 Hadoop 3.x 下的 3 点差异在 Hadoop 生态系统中,HDFS(Hadoop Distributed File System)是最核心的分布式文件存储组件。对于数据工程师和平台开发者来说,熟练掌握 H…
📅 2026/7/12 7:06:11
在 Linux 桌面环境中,KDE Plasma 以其高度可定制性著称,而 Arch Linux 则提供了最新、最干净的软件包基础。将这两者结合,完全有可能打造出视觉上接近 macOS 的桌面体验。这种美化不仅仅是更换壁纸和图标,更涉及到全局主题、窗口装…
📅 2026/7/12 7:06:11
DNS劫持深度解析(第二期):实战检测与防御技巧
摘要:在上一期内容中,我们已经拆解了DNS的核心作用、DNS劫持的定义、本质与常见类型,以及个人、企业、公共场景下的核心危害,为实战检测与防御做好…
📅 2026/7/12 7:06:11
1. 项目背景与核心需求警报系统在工业控制、安防监控、医疗设备等领域扮演着关键角色。传统蜂鸣器在复杂环境(如高噪音车间、户外风雨天气)中往往存在声音穿透力不足、频段单一等问题。本项目采用EPT-14A4005P压电陶瓷发声器与STM32F756ZG高性能MCU的组合…
📅 2026/7/12 7:05:11
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/12 0:00:04
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/12 0:00:28
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/12 0:00:28
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/12 0:00:04
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/12 0:00:28
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/12 0:00:28
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/12 0:15:59
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54