# 导语
在日常开发中,我们经常会遇到大文件上传的需求,比如视频上传、文档备份等场景。普通的单次上传方式在面对数百MB甚至数GB的文件时会遇到诸多问题:请求超时、内存占用过高、网络中断后需要重新上传等。
本文将深入讲解大文件上传的核心解决方案,包括分片上传、断点续传和秒传三大核心功能,并提供完整的代码实现。
# 一、大文件上传核心概念
# 1.1 什么是分片上传
分片上传的原理是将大文件切割成多个小块(Chunk),每个小块单独发送请求到服务端,服务端接收并保存所有分片后再合并成完整的文件。

分片上传的优势:
- 支持断点续传:网络中断后,只需上传未完成的分片
- 并行上传:多个分片可以并行传输,提高上传速度
- 减少内存占用:分片处理,不需要一次性加载整个文件到内存
# 1.2 断点续传原理
断点续传的核心是记录已上传的分片信息。客户端首先询问服务端文件的上传状态,服务端返回已上传的分片列表,客户端只需上传剩余分片。
# 1.3 秒传原理
秒传是断点续传的特例。当服务端检测到相同文件已存在时,直接返回成功,无需真正上传文件。实现秒传的关键是文件唯一标识——通过 Hash 算法(如 MD5)计算文件的指纹。
# 二、前置知识
# 2.1 File 对象
File 对象是特殊类型的 Blob,包含文件的基本信息:
| 属性 | 描述 |
|---|---|
File.name |
文件名 |
File.size |
文件大小(字节) |
File.type |
文件 MIME 类型 |
File.lastModified |
最后修改时间 |
# 2.2 Blob 与分片
使用 Blob.slice() 方法可以对文件进行分片:
const blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
const chunk = blobSlice.call(file, start, end); // 返回指定范围的 Blob
@前端进阶之旅: 代码已经复制到剪贴板
# 2.3 FileReader 读取文件
const fileReader = new FileReader();
fileReader.readAsArrayBuffer(blob); // 读取为 ArrayBuffer
fileReader.onload = (e) => {
console.log(e.target.result); // 读取结果
};
@前端进阶之旅: 代码已经复制到剪贴板
# 2.4 FormData 上传
大文件上传必须使用 multipart/form-data 格式: