实战:5分钟搞懂OkHttp断点上传

「本文已参与好文召集令活动,点击检查:后端、大前端双赛道投稿,2万元奖池等你挑战!」

1、前语

常常会有同学识:文件的断点上传怎样结束?

断点上传/下载,这是在客户端常常遇到的场景,当我们需求上传或下载一个大文件时源码之家,都会考虑运用断点续传的方法。

android的drawable类点上传相较于断点下载来说,最大的差异就在于断点方位的记载,上传记载在服务端,下载记载在客户端,因而http代理,客户端需求在上传前,经过接口去拿到文件的断点方位,然后在上传时,将文件输入流跳转到断点方位

2、预备作业

关于文件上传,其实就是打开文件的输入流,不停的读取数据到byte数组中,随后写出到服务端;那客户端要做的就是越okhttp面试过现已上传的部分,也Android就是直接跳到断点方位,这android平板电脑价格样就可以从断点方位去读取数据,也就到源码买卖网站源码达了断点上传的目的。

伪代码如下:

St源码怎样做成app软件ring filePath = ".android下载安装..";
long skipSize = 100;  //假android平板电脑价格定断点方位是 100 byte
InputStream input = input = new FileIn源码年代putStream(filePath);
input.skip(skipSize)  //跳转到断点方位

可是,OkHttp并没有直接供给设置断点的方前端法,所以需求客户端自定义Reqandroid下载安装uestBodhttp://www.baidu.comy,取名为FileRequestBody,如下:

//为简化阅览,已省android的drawable类掉部分源码买卖平台排行代码
public class Fil前端eRequestBody extends Requhttps和http的差异esokhttp3源码分析tBody {
private finalhttp协议 File file;
private final long skipSize;  /httpwatch/断点方位
prihttp协议vate final Mokhttp面试回答ediaType mediaType;
public FileRequestBody(File file, long skipSize, @Nulhttps和http的差异lable MediaType mediaType) {
this.file = file;
this.skipSize = skipSize;
this.mediaType = mediaType;
}
@Overrid源码之家e
public long contentLehttp://192.168.1.1登录ngth() throws IOEx源码年代训练怎样样cehttp://192.168.1.1登录ption {
return file.length() - skipSize;
}
@Override
public void writeTo(@NotNull BufferedSink sink) throws IOException {
InputStream input = null;
Source source = null;前端开发需求学什么
try {
inp前端面试题ut = new FileInpu源码本钱tStream(file);
if (skipSize > 0) {
input.skip(s源码买卖平台排行kipSize); //跳到断点方位
}
source =okhttp运用 Okio.source(input)前端开发是干什么的;
sink.writeAll(source);
} finally {
OkHttpCompat.closeQuietly(source,源码买卖网站源码 input);
}
}
}

为便利阅览,以上省掉前端部分源码,FileRequestBody类无缺源码

有了FileRequestBody类,我们只需求传入一个断点方位,剩余的作业就跟一般的文件上传相同。
接下来,直接进入代码结束。

3、代码结束

3.1 获取断点方位

首要,需求服务端供给一个接口,经过userId去查找该用户未上传结束的使命列表,代码如下:

RxHttp.get("/.../getToUploadTask")
.add("userId", "88888888")
.asList<ToUplookhttp运用adTask>()
.subscribe({
//成功回调,这儿经过 it 拿到 List<ToUploadTask>
}, {
//异常回调
});

其间ToUploadTask类如下:

//待上传使命
data class ToUploadTask(
val md5:android下载安装 String,          //文件的md5,用于验证文件的唯一HTTP
val filePath: String,前端     //文件在客户端的绝对路径
val skipSize: Loandroid是什么手机牌子ng = 0    //断点方位源码编辑器手机版下载
)

注:md5、filePath 这两个参数需求客户端源码本钱在文件上OKHttp传时传递给服务端,用于对文件的校验,防止文件紊乱

3.2 断点上传

有了待上传使命,客户端android下载就可以履源码行断点上传操作,OkHttp代码如下:

fun uploadFile(uploadTask: ToUploadTask) {
//1.校验文件是否存在
val fandroid下载安装ile = File(uploadTaskokhttp原理 面试.filePath)
if (!file.exists() && !file.isFile) return
//2.校验文okhttp长处件的 md5 值
val fileMd5 = FileUtils.getFileMD5ToStringhttpclient(file)
if (!fileMd前端5.equals(uploadTask.md5)) return
//3.构建央求体
val fileRequestBody = FileRequesandroid平板电脑价格tBody(file, uploadTask.skipSize, BuildUtil.getM源码买卖网站源码ediaType(file.name))
val mul源码编辑器tipartBody = MultipartBody.Builder()
.addFormDataPart("userId", "88888888")
.addFormDataPart("md5", fileMd5前端训练组织)
.addFormDataPart("filePath前端学什么", file.absolutePath)
.addFormDataPaandroid什么意思rt("file", file.name, fileRequestBo前端开发dy) //增http 404加文件body
.build()
//4.构建央求
val request = Requhttp 500est.Builder()
.url("/.../uploadFile")
.post(mulAndroidtipart前端和后端的差异Body)
.build()
//5.履行央求
val okClient = OkHttpClient.Builder().build()
ohttp://www.baidu.comkandroid体系Client.newCalhttpwatchl(r前端开发需求学什么equest).enqueue(objecthttpwatch : Callback {
override fun onFailure(call: Call, e: IOException) {
//异常回调
}
overr前端工程师ide fun onResponse(calandroid什么意思l: Call, response: Response) {
//成功回调
}
})
}

F源码编辑器手机版下载IleUtils源码,BuildUtil源码

当然,考虑到很少人会直接运用OkHttp,所以这儿也贴出RxHttp的结束httpwatch代码,很简单,仅需构建一个UpFile目标即可,就可很便利的http 500监听上传发展,代码前端框架如下:

fun uploadFile(uploadTask: ToUploadTask) {
//1.校验文件是否存在                                                      
val file = File(uploadTas源码之家k.file源码Path)
if (!file.exists() && !file.isF前端工程师ile) return
//2.校验文件的 md5 值                                                      
val fileMd5 = FileUtils.getFileM源码编辑器手机版下载D5ToString(fileokhttp原理)
if (!fileMd5.equals(uploadTask.md5)) return
val upFile = UpFile("file", f源码买卖网站源码ile, file.name, uphttps和http的差异loadTask.skipSiz前端开发需求学什么e)
//3.前端开发是干什么的直接上传
Rhttp协议xHttp.postForm("/.../uploadFile")
.add("userIdhttp 500", "88888888")
.add("md5", fileMd5)
.add("filePath", file.absolutePath)
.addFile(upFile)
.upload(AndroidSchedulers.mainThread()) {
//上传发展回调           
}
.asString()
.subscribe({
//成功回调                                                            
}, {
//异常回调                                                           
}http://www.baidu.com)
}

4、小结

断点上传okhttp3相较一般的文件上传,客户端多了一个断点的设置,大部分作业量在okhttp3服务端,服务端不只需HTTP求处理文件的拼接逻辑,还需记载未上传结束的使命,并经过接口露出给客户端。

5、举荐阅览

RxHttp 让你眼前一亮的Http央求结构

RxHttp ,比Retrofit 更高雅的协程体会

RxHttp 完美android手机适配Android 10/11 上传/下载/发展监听

RxHttp 3k star,恣意央求三步搞定,把握央求三部曲,就把握了R源码年代训练怎样样xHttp的精髓。

实战:5分钟搞懂OkHttp断点上传

发表评论

提供最优质的资源集合

立即查看 了解详情