起因
项目中遇到有通过手机App拍摄并上传视频的功能,而视频一般都比较大,当然也可以限制格式和前端大小限制解决,但是出于好奇,还是调研了下断点续传:
使用场景:
多为手机端
- 网络情况比较差,前端和服务器经常会断开连接;
- 上传文件较大;
- 上传文件大小未知;
原理简述:
- 客户端(native)将文件做md5值;
- 客户端(native)根据指定的block大小(假设:每块10M)和文件总大小(假设:100M)计算最终的block数(10);
- 客户端(native)将文件信息发送到服务器,包括要上传的文件名、大小、类型、块数、md5值;
- 服务器端(server-api)根据md5值,查询服务器上是否已经存在对应的文件,以及文件的上传状态(上传是否完成、文件块是否已合并、已上传block数量);
- 若已经上传完成,将文件URL地址返回给客户端(native);
- 若未上传完成,将已经上传的block编号返回给客户端(native);
- 客户端(native)根据返回值判断,如果未上传完成,则从本地文件中读取未上传完成的块内容;
- 客户端(native)使用HTTP方式上传到服务器;
- 当这个block上传完毕之后,服务器端将已经上传完成的块到数据库;
- 服务器端检查整个文件是否已经上传完成;
- 若未完成,则返回已经上传的块编号到客户端(native)让它继续上传;
- 若上传完成,则进行块文件合并过程,将其合并成目标文件;
- 合并完成后,服务器将最终的文件URL地址返回给客户端;
分两部分工作:
- 前端和server-api的断点上传
- 服务器端、native端都好支持,需要额外code进行处理;
- web端可基于h5 websocket来支持;
(参考)http://my.oschina.net/u/590484/blog/74054,需要自己写code,简单调研下,web端难度大一点);
- server-api和阿里云OSS的断点上传(OSS有断点上传的接口支持,简单的写一些code);