前言
分块上传和断点下载很像,就是讲文件分为多份来传输,从而实现暂停和继续传输。区别是断点下载的进度保存在客户端,ey往是写入数据库,分块上传的进度保存在服务器,每次可以通过文件的md5请求服务器,来获取最新的上传偏移量。但是这样明显效率偏低,客户端可以把offSet保存在内存,每上传一块文件服务器返回下一次的offSet。只不过这个offSet不需要保存在数据库,每次app关闭在打开继续上传可以请求服务器,获取最新偏移量。
分块上传原理
1.客户端向服务端申请文件的上传地址
a. 如果上传过,直接返回uuid (快速上传)
b. 没上传过,返回 上传地址url + 上传偏移量offset
下面上传一段31M大小的mp4文件,申请上传地址服务端返回offSet = 0表示文件没有上传过,需要从头开始上传
image.png
2.客户端对本地文件进行分块,比如10M为一块chunk
上传第一块:
image.png
3.客户端以标准表单方式,上传 offset 到 offset+chunk的文件分块,每次上传完服务端返回新的offset,客户端更新offset值并继续下一次上传,如此循环。
上传最后一块:
image.png
4.最后服务端返回文件uuid,代表整个文件上传成功
基于Okhttp的实现
Okhttp已经支持表单形式的文件上传,剩下的关键就是:
构造分块文件的RequestBody,对本地文件分块,和服务端约定相关header,保存offset实现分块上传
构造RequestBody
继承之前实现的进度监听RequestBody:
public class MDProgressRequestBody extends FileProgressRequestBody {
protected final byte[] content;
public MDProgressR