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

该博客详细介绍了如何使用OkHttp实现Java文件的分块上传。首先,客户端向服务器申请上传地址,如果文件已上传,则返回uuid,否则返回上传地址和偏移量。然后,客户端将文件分块并逐块上传,每次上传后服务端返回新的偏移量。最后,当所有块上传完成后,服务端返回文件uuid表示上传成功。文中还提供了基于OkHttp的分块上传实现代码。
摘要由CSDN通过智能技术生成

前言

分块上传和断点下载很像,就是讲文件分为多份来传输,从而实现暂停和继续传输。区别是断点下载的进度保存在客户端,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 MDProgressR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值