文件分块上传
特性
1.可以在上传之前检查文件是否在服务器已经存在,如果已经存在则可以实现秒传的功能。
2.可以在下载的过程中暂停并随时恢复,避免中途上传中断后重新上传。
3.可以实现并发上传,充分发挥客户端和服务器的性能。
4.文件服务器可以协调内存的使用,避免了文件占用内存过多而导致服务不稳定。
思路
- 文件验证 (
verifyUrl: Get
)
客户端发送一个验证请求,利用sha256
根据文件内容计算出唯一标识,服务端可根据该值判断是否已经上传,或者上传了部分分片,并返回给前端。客户端依此可以实现续传或秒传的效果。
请求参数
属性 | 类型 | 说明 |
---|---|---|
hash | String |
文件的 sha256 值 |
size | Number |
文件大小 |
name | String |
文件名 |
返回参数
属性 | 类型 | 说明 |
---|---|---|
name | String |
返回线上文件名 |
needUpload | Boolean |
文件是否需要上传 |
uploadedChunks | [Number]<Number> |
未完全上传时,返回已上传的分块序号和大小 |
- 接收分块 (
uploadUrl: Post
)
客户端发送文件的二进制数据,content-type
为 application/octet-stream
,服务端接收后放入暂存区。
- 合并分块
分块全部发送完毕后,服务端将分片按序号进行合并。
上传接口的 query
中包含如下分块信息:
请求参数
属性 | 类型 | 说明 |
---|---|---|
hash | String |
文件的 sha256 值 |
size | Number |
文件大小 |
number | Number |
分块的编号,从 1 开始 |
返回参数
属性 | 类型 | 说明 |
---|---|---|
needUpload | Boolean |
文件是否需要上传 |
uploadedChunks | [Number]<Number> |
未完全上传时,返回已上传的分块序号和大小 |