在上一篇文章中讲到分片思路,那么这篇文章着重讲述怎么进行操作。
本技术大文件分片上传流程会调用1个api,包含:
uploadShard 单独的分片上传接口。
- 服务端通过uploadShard 接口接收的file_md5值去redis里面查找当前文件片上传的信息:
- 如果未查到信息,初始化未上传文件片索引值列表。计算方法:total_shard =ceil(total_size / shard_size获取总文件片数,构造一个分片文件索引值列表shard_index_list =[0,1,2,……. total_shard-1];并将用file_md5作为键值,初始化构造的上传文件信息数据如下,存储在redis里面:
[[index' => 0, 'shard_file' => '/upload/20180803/file_md5.shard.0', 'status' => 0],
[index' => 1, 'shard_file' => '/upload/20180803/file_md5.shard.1', 'status' => 0],
[index' => 2, 'shard_file' => '/upload/20180803/file_md5.shard.2', 'status' => 0],....], 其中的shard_file是文件存储路径,提供后面查找该文件是否存在;index是每片文件索引值;status每片文件上传状态。
2.前端开始根据文件大小开始分片上传
根据分片文件索引列表shard_index_list, web端通过索引文件值shard_index按照下面的算法计算当前索引文件片:
index = shard_index
start = index * config.shardSize
end = Math.min(config.file.size, start + config.shardSize)
fileData = config.file.slice(start, end)
fileData为当前索引值切分的片文件,并生成该片文件生成shard_md5值
- 调用uploadShard接口,上传该片文件fileData,uploadShard接口处理此片文件是否存在以及是否上传成功并将结果返回,存在就继续shard_index_list列表下一值并上传
- 如果该片文件上传失败,非文件内部错误(非法文件,非法参数),重试3次上传
- 如果该片文件上传失败,非法文件,非法参数,则停止上传
- web端循环shard_index_list,多次调用uploadShard接口上传
在uploadShard接口里面,通过file_md5 在redis里面查找当前文件片索引值(传过来的shard_index值)的上传状态status
- 如果status为0,则查找该分片文件索引值的文件存储地址shard_file,并写入该地址的文件中,校验文件合法性
- 如果status为1,则该片文件已经上传过直接返回上传成功
- 如果索引值列表上传状态status全为1,则按照分片文件索引顺序 [0,1,2,……. total_shard-1],写入新的文件中,合并文件,校验文件合法性