參考資料:
文件的上傳下載,是基礎(chǔ)網(wǎng)絡包的一塊重要部分,基于上面2篇的一些實現(xiàn),首先實現(xiàn)的是 okhttp3的文件上傳下載邏輯;
具體代碼:https://github.com/zhaoyubetter/basenet
Builder的修改##
新增2個成員,用來表示上傳下載,信息,注意的是,要么是下載,要么是上傳,不能一次請求,完成2個操作,這里,暫時還沒有考慮好如何去修改,現(xiàn),只實現(xiàn)好了功能;
/**
* 上傳的文件
*/
private Map<String, File> mUploadFiles;
/**
* 下載的文件名
*/
private File mDownFile;
將IRequestCallBack類,修改成抽象類:
public abstract class AbsRequestCallBack<T> {
public void onSuccess(T t) {
}
public void onFailure(Throwable e) {
}
// 表示進度
public void onProgressUpdate(long contentLength, long bytesRead, boolean done) {
}
}
OkHttpRequest類的修改:
private void realRequest(Request.Builder tBuilder) {
if (mDownFile != null) {
downFile();
return;
}
private void downFile() {
// 是否是下載
final OkHttpClient tClient = sOkHttpClient.newBuilder().addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.body(new ProgressResponseBody(originalResponse.body(), new ProgressCallback() {
@Override
public void update(long contentLength, long bytesRead, boolean done) {
if (null != mCallBack) {
mCallBack.onProgressUpdate(contentLength, bytesRead, done);
}
}
})).build();
}
}).build();
客戶端調(diào)用##
// 下載文件測試
final String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();
File file = new File(absolutePath + "/DCIM/Camera/down.jpg");
new OkHttpRequest.Builder().url("https://raw.githubusercontent.com/zhaoyubetter/MarkdownPhotos/master/C/52C2504C.png").callback(new AbsRequestCallBack() {
@Override
public void onSuccess(Object o) {
Log.e("okHttp success", o.toString());
}
@Override
public void onFailure(Throwable e) {
Log.e("okHttp failure", e.toString());
}
@Override
public void onProgressUpdate(long contentLength, long bytesRead, boolean done) {
super.onProgressUpdate(contentLength, bytesRead, done);
Log.e("okHttp success", String.format("total:%s, already:%s, isDone: %s", contentLength, bytesRead, done));
}
}).downFile(file).build().request();