下载文件写完了
接下来就是上传文件了
继续完善!
首先,在我们的基础接口INetManager里新增方法postFile
复写这个方法用来上传文件
代码如下:
/**
* Created by lenovo on 2019/11/8.
* 网络请求工具类
*/
public interface INetManager {
/**
* @param url 请求网址
* @param callback 回调
* @param tag 请求的tag
*/
void get(String url, INetGetCallBack callback, Object tag);
/**
* post请求
*
* @param url
* @param headersParams head
* @param params 参数
* @param callback 回调
* @param tag 请求的tag
*/
void post(String url, Map<String, String> headersParams, Map<String, String> params, INetPostCallBack callback, Object tag);
/**
* 上传文件
*
* @param url
* @param fileKey 文件的key
* @param file 要上传的文件
* @param params 参数
* @param callback 回调
* @param tag tag
*/
void postFile(String url, String fileKey, File file, Map<String, String> params, INetPostFileCallBack callback, Object tag);
/**
* 下载文件
*
* @param url
* @param file 下载的文件
* @param callback 回调
* @param tag tag
*/
void downFile(String url, File file, INetDownFileCallBack callback, Object tag);
/**
* 取消请求
*
* @param tag
*/
void cancel(Object tag);
}
大概介绍一下这个方法的几个参数
url就是请求的地址
filekey是你把文件作为参数上传时的key值
file是你要上传的文件
callback是回调
tag是请求标记
INetPostFileCallBack代码如下:
/**
* Created by lenovo on 2019/11/9.
* 上传文件的返回结果
*/
public interface INetPostFileCallBack {
void success(String string);
void failed(Throwable throwable);
}
这里就没有加进度监听的方法了
有需要的可以自己去完善
然后,就是关键的OkhttpNetManager里的功能实现了
这边也直接上代码吧
@Override
public void postFile(String url, String fileKey, File file, Map<String, String> params, final INetPostFileCallBack callback, Object tag) {
if (!file.exists()) {
//文件不存在
Log.d("print", "postFile: 要上传的文件不存在");
return;
}
// form 表单形式上传
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
// MediaType.parse() 里面是上传的文件类型。不清楚的可以写application/octet-stream
//图片的类型就可以写image/*这种
RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
// 参数分别为, 请求key ,文件名称 , RequestBody
builder.addFormDataPart(fileKey, file.getName(), body);
if (params != null) {
// map 里面是请求中所需要的 key 和 value
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.addFormDataPart(entry.getKey(), entry.getValue());
}
}
MultipartBody multipartBody = builder.build();
Request request = new Request.Builder().url(url).post(multipartBody).tag(tag).build();
sokHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
if (call.isCanceled()) {
return;
}
//非ui线程
shandler.post(new Runnable() {
@Override
public void run() {
//ui线程
callback.failed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
if (call.isCanceled()) {
return;
}
final String string = response.body().string();
//非ui线程
shandler.post(new Runnable() {
@Override
public void run() {
//ui线程
callback.success(string);
}
});
} catch (Throwable e) {
e.printStackTrace();
callback.failed(e);
}
}
});
}
记得加上网络权限和文件读写权限,还需要动态申请读写权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在调用上传文件方法之前
要先创建自己要上传的File对象和filekey
如果有参数,和post方法一样用map传过去
然后是调用
INetClient.getsInstance()
.getmNetManager()//得到具体网络请求实现类,这里是OkhttpNetManager
.postFile(url,filekey,file,map参数,回调,tag);
到这里,基本的网络请求功能就完成了
以后如果有相应的新的需求,这套框架也方便扩展
目前以及完善的功能:
get
post
downfile
postfile
采用的是okhttp来实现。
完结~撒花~!