# 分片上传

关于大文件分片上传的一些思考

## 浏览器

### 创建文件 `hash`

- 创建文件的 `hash` 值。
- 提交上传文件基本数据和文件 `hash` 值。
- 如果存在的话，忽略本次文件上传；并将该文件路径指向用户服务器存储空间中。

当文件不存在或上传一部分文件数据时，进入下一流程。

### 文件分片

- 访问服务器获取文件分片最大值。
- 通过循环切割文件，并创建每一个分片的 `hash`

### 文件上传

- 根据首次与服务器通信结果，判断是否为断点上传
- 如果是断点上传，判断断点位置，
- 获取对应分片，以此分片为起点开始上传

### 进度条

- 不论是断点还是首次上传文件，进度条为已传分片数除总分片数

---

## 服务器

### 检测文件 `hash`

#### 数据库检测 `hash` 是否存在

存在

- 将该文件与用户传入文件基本信息结合
- 存入云空间
- 通知前端，文件秒传成功

---

不存在或断点

- 创建临时上传空间（存在时间为最后断点上传后的 `24` 个小时或上传成功后）
- 用户云盘数据中写入临时上传信息（存在时间为最后断点上传后的 `24` 个小时或上传成功后）
- 如果是断点之后续传，告知前端最后一个分片 `hash`

#### 文件上传

- 获取分片数据，存入临时上传空间
- 上传所有分片，合并分片，创建文件 hash，与文件原 hash 比对
- hash 不一致，告知用户上传失败
- hash 确认无误，放入用户云盘中
- 清理数据
