java文件分块上传,OkHttp文件上传(2):实现文件分块上传

前言

分块上传和断点下载很像,就是讲文件分为多份来传输,从而实现暂停和继续传输。区别是断点下载的进度保存在客户端,ey往是写入数据库,分块上传的进度保存在服务器,每次可以通过文件的md5请求服务器,来获取最新的上传偏移量。但是这样明显效率偏低,客户端可以把offSet保存在内存,每上传一块文件服务器返回下一次的offSet。只不过这个offSet不需要保存在数据库,每次app关闭在打开继续上传可以请求服务器,获取最新偏移量。

分块上传原理

1.客户端向服务端申请文件的上传地址

a. 如果上传过,直接返回uuid (快速上传)

b. 没上传过,返回 上传地址url + 上传偏移量offset

下面上传一段31M大小的mp4文件,申请上传地址服务端返回offSet = 0表示文件没有上传过,需要从头开始上传

b2d4864c4cfc

image.png

2.客户端对本地文件进行分块,比如10M为一块chunk

上传第一块:

b2d4864c4cfc

image.png

3.客户端以标准表单方式,上传 offset 到 offset+chunk的文件分块,每次上传完服务端返回新的offset,客户端更新offset值并继续下一次上传,如此循环。

上传最后一块:

b2d4864c4cfc

image.png

4.最后服务端返回文件uuid,代表整个文件上传成功

基于Okhttp的实现

Okhttp已经支持表单形式的文件上传,剩下的关键就是:

构造分块文件的RequestBody,对本地文件分块,和服务端约定相关header,保存offset实现分块上传

构造RequestBody

继承之前实现的进度监听RequestBody:

public class MDProgressRequestBody extends FileProgressRequestBody {

protected final byte[] content;

public MDProgressRequestBody(byte[] content, String contentType , ProgressListener listener) {

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值