前言项目里经常遇到大文件上传场景比如视频、压缩包、离线备份包。直接一次性上传很容易遇到两个致命问题请求超时、后端一次性读取整个文件导致内存飙升服务直接OOM。本文记录一套生产可用的分片上传方案前端切片 Node 后端接收 合并校验附带断点续传思路。一、整体思路前端按固定大小对文件切片一般 2MB~5MB 一片使用文件hash作为唯一标识用来判断文件是否上传过、分片是否重复每一个分片单独发起请求携带分片序号、总分片数、文件hash后端接收分片先写入临时目录所有分片上传完成前端发送合并指令后端按顺序读取分片合并成完整文件删除临时分片增加校验md5校验合并后的文件完整性。二、前端核心切片示例简化function sliceFile(file, chunkSize 2 * 1024 * 1024) {const chunks [];let start 0;while (start file.size) {const end Math.min(start chunkSize, file.size);chunks.push(file.slice(start, end));start end;}return chunks;}三、Node 后端接收分片Expressconst fs require(fs);const path require(path);router.post(/upload-chunk, async (req, res) {const { hash, index } req.body;const chunkPath path.join(./temp, ${hash}-${index});const stream fs.createWriteStream(chunkPath);req.pipe(stream);stream.on(finish, () {res.json({ code: 200, msg: 分片接收成功 });});});四、合并分片逻辑后端收到合并请求后读取该hash对应的所有分片按序号排序流式写入目标文件。重点不要全部读入内存再合并必须流式拼接否则大文件依然内存爆炸。五、踩坑记录分片大小不是越大越好太大依然容易超时太小请求太多挤占连接临时目录要做定时清理失败分片堆积会占满磁盘并发上传分片时控制并发数量防止把后端带宽打满浏览器关闭、网络中断后依靠hash可以实现断点续传前端只上传缺失分片。六、扩展方向对接对象存储OSS分片直传OSS增加上传进度持久化到Redis增加权限校验防止恶意上传垃圾文件。总结分片上传不是什么新技术但很多网上示例只做Demo没有考虑内存、清理、校验。流式处理 临时目录管理是稳定落地的关键。