OkHttp也好,Retrofit也罢,上传文件的本质都是要把上传的文件放入Http协议的请求体中,只不过不同的网络框架有不同的写法而已
接下来以本公司的接口示例讲解怎么使用OkHttp上传单文件
接口文档
上传文件的所谓的难点在于对于请求体的构建,那么OkHttp构建文件表单请求体的模板代码如下:
//filePath为文件的绝对路径,这里注意权限问题
File file = new File(filePath);
if (!file.exists()) {
log.d("找不到该文件");
return;
}
RequestBody requestBody= null;
//声明请求体的类型为文件表单类型
MediaType mediaType = MediaType.parse("multipart/form-data");
//通过静态方法创建请求体
//file为要上传的文件,mediaType为上一步中 声明的请求体类型
requestBody = RequestBody.create(file, mediaType);
//创建文件表单的请求体,把文件请求体、文本参数放入表单中
MultipartBody multipartBody = new MultipartBody.Builder()
.addFormDataPart("file",file.getName(),requestBody)
.addFormDataPart("content","这个是描述内容")
.build();
Request request = new Request.Builder().url("http://xxxxxxxxxx")
.post(multipartBody)//post方式提交表单
.build();
//创建请求任务
Call call = OkhttpManager.getInstance().getOkHttpClient().newCall(request);
//执行异步请求任务
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
}
});
接下来是使用Retrofit上传单个文件
由于Retrofit只是对网络请求做了一次包装,所以Retrofit的上传单个文件的方式跟OkHttp几乎一模一样
1、接口定义
@POST("http://xxxxxxx")
@Multipart
Observable<UpHeadReseponse> upHead(@Part("image") MultipartBody multipartBody,@Part("content") String content);
参数解释:
@POST:post方式请求
@Multipart:文件表单提交
@Part("image") MultipartBody body:形参为 image,实参为MultipartBody,这个MultipartBody是OkHttp的(有没有觉得很奇怪)
@Part("content")形参为content,实参为String,这个参数是接口文档中要求的另外一个参数
使用方式如下
//filePath为文件的绝对路径,这里注意权限问题
File file = new File(filePath);
if (!file.exists()) {
log.d("找不到该文件");
return;
}
RequestBody requestBody= null;
//声明请求体的类型为文件表单类型
MediaType mediaType = MediaType.parse("multipart/form-data");
//通过静态方法创建请求体
//file为要上传的文件,mediaType为上一步中 声明的请求体类型
requestBody = RequestBody.create(file, mediaType);
//创建文件表单的请求体,把文件请求体、文本参数放入表单中
MultipartBody multipartBody = new MultipartBody.Builder()
.addFormDataPart("file",file.getName(),requestBody)
.addFormDataPart("content","这个是描述内容")
.build();
//通过工具类初始化Retrofit
Retrofit retrofit = RetrofitUtil.getInstance().getRetrofit();
//创建接口的实例
ApiService apiService = retrofit.create(ApiService.class);
//调用方法
Observable<UpHeadReseponse> observable = apiService.upHead(multipartBody,"这个是描述");
// TODO: 2019/11/15 接下来就是使用observable发起请求了 ,如果你不会,我建议你出门左转先看看retrofit怎么使用
**注释写的已经够详细的了,这段模板代码足以支撑上传单个文件**
现在再回过头来看本文中开头的那一句话:OkHttp也好,Retrofit也罢,上传文件的本质都是要把上传的文件放入Http协议的请求体中,只不过不同的网络框架有不同的写法而已
OkHttp与Retrfofit上传单个文件的重点都在于对于请求体的构建,而这两个框架使用了相同的请求体即:MultipartBody,所以重点就集中到了MultipartBody的构建上。
PS:如果在调试过程中发生异常,那么仔细检查:
一、是不是文件过大,超时了
二、是不是没有Sd卡权限
三、别的未知原因😂
网友评论