写点什么

OkHttp 断点上传的“基操”(1),完美讲解内存缓存 LruCache 实现原理

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

sink.writeAll(source);


} finally {


OkHttpCompat.closeQuietly(source, input);


}


}


}


为方便阅读,以上省略部分源码,[FileRequestBody 类完整源码](


)


有了FileRequestBody类,我们只需要传入一个断点位置,剩下的工作就跟普通的文件上传一样。 接下来,直接进入代码实现。


3、代码实现


======


3.1 获取断点位置




首先,需要服务端提供一个接口,通过userId去查找该用户未上传完成的任务列表,代码如下:


RxHttp.get("/.../getToUploadTask")


.add("userId", "88888888")


.asList<ToUploadTask>()


.subscribe({


//成功回调,这里通过 it 拿到 List<ToUploadTask>


}, {


//异常回调


});


其中ToUploadTask类如下:


//待上传任务


data class ToUploadTask(


val md5: String, //文件的 md5,用于验证文件的唯一性


val filePath: String, //文件在客户端的绝对路径


val skipSize: Long = 0 //断点位置


)


注:md5、filePath 这两个参数需要客户端在文件上传时传递给服务端,用于对文件的校验,防止文件错乱


3.2 断点上传




有了待上传任务,客户端就可以执行断点上传操作,OkHttp 代码如下:


fun uploadFile(uploadTask: ToUploadTask) {


//1.校验文件是否存在


val file = File(uploadTask.filePath)


if (!file.exists() && !file.isFile) return


//2.校验文件的 md5 值


val fileMd5 = FileUtils.getFileMD5ToString(file)


if (!fileMd5.equals(uploadTask.md5)) return


//3.构建请求体


val fileRequestBody = FileRequestBody(file, uploadTask.skipSize, BuildUtil.getMediaType(file.name))


val multipartBody = MultipartBody.Builder()


.addFormDataPart("userId", "88888888")


.addFormDataPart("md5", fileMd5)


.addFormDataPart("filePath", file.absolutePath)


.addFormDataPart("file", file.name, fileRequestBody) //添加文件 body


.build()


//4.构建请求


val request = Request.Builder()


.url("/.../uploadFile")


.post(multipartBody)


.build()


//5.执行请求


val okClient = OkHttpClient.Builder().build()


okClient.newCall(request).enqueue(object : Callback {


override fun onFailure(call: Call, e: IOException) {


//异常回调


}


override fun onResponse(call: Call, response: Response) {


//成功回调


}


})


}


当然,考虑到很少人会直接使用OkHttp,所以这里也贴出?RxHttp?的实现代码,很简单,仅需构建一个UpFile对象即可,就可很方便的监听上传进度,代码如下:


fun uploadFile(uploadTask: ToUploadTask) {


//1.校验文件是否存在


val file = File(uploadTask.filePath)


if (!file.exists() && !file.isFile) return


//2.校验文件的 md5 值


val fileMd5 = FileUtils.getFileMD5ToString(file)


if (!fileMd5.equals(uploadTask.md5)) return


val upFile = UpFile("file", file, file.name, uploadTask.skipSize)


//3.直接上传


RxHttp.postForm("/.../uploadFile")


.add("userId", "88888888")


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


.add("md5", fileMd5)

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
OkHttp 断点上传的“基操”(1),完美讲解内存缓存LruCache实现原理