@Override
public long contentLength() throws IOException {
return file.length() - skipSize;
}
@Override
public void writeTo(@NotNull BufferedSink sink) throws IOException {
InputStream input = null;
Source source = null;
try {
input = new FileInputStream(file);
if (skipSize > 0) {
input.skip(skipSize); //跳到断点位置
}
source = Okio.source(input);
sink.writeAll(source);
} finally {
OkHttpCompat.closeQuietly(source, input);
}
}
}
为方便阅读,以上省略部分源码,FileRequestBody类完整源码
有了FileRequestBody
类,我们只需要传入一个断点位置,剩下的工作就跟普通的文件上传一样。 接下来,直接进入代码实现。
3、代码实现
======
3.1 获取断点位置
首先,需要服务端提供一个接口,通过userId
去查找该用户未上传完成的任务列表,代码如下:
RxHttp.get(“/…/getToUploadTask”)
.add(“userId”, “88888888”)
.asList()
.subscribe({
//成功回调,这里通过 it 拿到 List
}, {
//异常回调
});
其中ToUploadTask
类如下:
//待上传任务
data class ToUploadTask(
val md5: String, //文件的md5,用于验证文件的唯一性
val file