断点续传

起因

项目中遇到有通过手机App拍摄并上传视频的功能,而视频一般都比较大,当然也可以限制格式和前端大小限制解决,但是出于好奇,还是调研了下断点续传:

使用场景:

多为手机端

  1. 网络情况比较差,前端和服务器经常会断开连接;
  2. 上传文件较大;
  3. 上传文件大小未知;

原理简述:

  1. 客户端(native)将文件做md5值;
  2. 客户端(native)根据指定的block大小(假设:每块10M)和文件总大小(假设:100M)计算最终的block数(10);
  3. 客户端(native)将文件信息发送到服务器,包括要上传的文件名、大小、类型、块数、md5值;
  4. 服务器端(server-api)根据md5值,查询服务器上是否已经存在对应的文件,以及文件的上传状态(上传是否完成、文件块是否已合并、已上传block数量);
  5. 若已经上传完成,将文件URL地址返回给客户端(native);
  6. 若未上传完成,将已经上传的block编号返回给客户端(native);
  7. 客户端(native)根据返回值判断,如果未上传完成,则从本地文件中读取未上传完成的块内容;
  8. 客户端(native)使用HTTP方式上传到服务器;
  9. 当这个block上传完毕之后,服务器端将已经上传完成的块到数据库;
  10. 服务器端检查整个文件是否已经上传完成;
  11. 若未完成,则返回已经上传的块编号到客户端(native)让它继续上传;
  12. 若上传完成,则进行块文件合并过程,将其合并成目标文件;
  13. 合并完成后,服务器将最终的文件URL地址返回给客户端;

分两部分工作: