5月27日 01:16
Koa.js 如何实现文件上传的断点续传?
断点续传的本质是"客户端记住传到哪了,服务端知道从哪继续接"。
核心流程:
- 上传前计算文件 hash(MD5/SHA1),作为文件唯一标识
- 发请求到服务端查"这个文件的哪些分片你有了"(返回已上传分片索引)
- 客户端只上传缺失的分片
- 服务端暂存每个分片
- 全部分片上完后,服务端合并分片为完整文件
Koa 侧关键点:
- 用
@koa/multer或直接读 stream 接收分片 - 分片命名规则:
{hash}-{index},便于按 hash 查找和按 index 排序 - 合并分片前校验每个分片的大小是否正确
- 合并完后校验完整文件的 hash 是否和客户端一致
追问
分片大小怎么定?
一般 1-5MB。太小请求次数多(HTTP 开销),太大断点续传意义不大了。网速好的用户可以用更大的分片。
并发上传多个分片好还是串行好?
并发上传更快,浏览器对同一域名的 HTTP/1.1 最大并发是 6 个(HTTP/2 不受限)。注意并发数不能太大——文件 I/O 是性能瓶颈,服务端同时写入大量分片会 IO 打满。
合并完大文件后内存会炸吗?
不会,用 fs.createWriteStream(流式写入)和 fs.createReadStream(流式读取)顺序追加。Koa 生态有 fs-extra 库做这些操作,底层是流式的不会一次性加载整个文件到内存。