Retrofit upload files
Retrofit upload files, brother find a lot of tutorials, full of pits, finally we have the results, accompanied by blogger address, thanks
http://blog.csdn.net/ITjianghuxiaoxiong/article/details/52135748?locationNum=3&fps=1
The first step, adding a reference gradle
compile ‘com.squareup.retrofit2:converter-gson:2.0.1’
compile ‘com.squareup.retrofit2:retrofit:2.0.1’
The second step, request interface
/**
* 数据请求服务
* create by malong at 2016/4/25 0:34
*/
public interface ApiService {
/**
* 上传头像
*/
@Multipart
@POST("/member/uploadMemberIcon.do")
Call<Result<String>> uploadMemberIcon(@Part List<MultipartBody.Part> partList);
}
A third step, the request tools
/**
* 数据请求控制工具类
* create by malong at 2016/4/25 0:30
*/
public class ApiUtil {
private static final String HOST = "http://www.update.test";//换成你上传用的服务器地址
private static Retrofit retrofit;
private static final int DEFAULT_TIMEOUT = 10;//超时时长,单位:秒
/**
* 获取根服务地址
*/
public static String getHOST() {
return HOST;
}
/**
* 初始化 Retrofit
*/
private static Retrofit getApiRetrofit() {
if (retrofit == null) {
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
okHttpBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
retrofit = new Retrofit.Builder()
.client(okHttpBuilder.build())
.baseUrl(HOST)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
return retrofit;
}
/**
* 创建数据请求服务
*/
private static ApiService getApiService() {
return ApiUtil.getApiRetrofit().create(ApiService.class);
}
/**
* 上传头像
*/
public static Call<Result<String>> uploadMemberIcon(List<MultipartBody.Part> partList) {
return ApiUtil.getApiService().uploadMemberIcon(partList);
}
}
Next is the key code to upload pictures
Method (recommended):
Add request method in service, pay attention to the use of @Multipart and @POST comment
/**
* 上传头像
*/
@Multipart
@POST("/member/uploadMemberIcon.do")
Call<Result<String>> uploadMemberIcon(@Part List<MultipartBody.Part> partList);
Pass parameters in the form of MultipartBody.Part list
/**
* 上传图片
* create by weiang at 2016/5/20 17:33.
*/
private void upLoad() {
File file = new File(filePath);//filePath 图片地址
String token = "ASDDSKKK19990SDDDSS";//用户token
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)//表单类型
.addFormDataPart(ParamKey.TOKEN, token);//ParamKey.TOKEN 自定义参数key常量类,即参数名 ,拼接的参数
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
builder.addFormDataPart("imgfile", file.getName(), imageBody);//imgfile 后台接收图片流的参数名
List<MultipartBody.Part> parts = builder.build().parts();
ApiUtil.uploadMemberIcon(parts).enqueue(new Callback<Result<String>>() {//返回结果
@Override
public void onResponse(Call<Result<String>> call, Response<Result<String>> response) {
AppUtil.showToastInfo(context, response.body().getMsg());
}
@Override
public void onFailure(Call<Result<String>> call, Throwable t) {
AppUtil.showToastInfo(context, "头像上传失败");
}
});
}
Adding a plurality of character string, can be added only in the form builder.addFormDataPart (key, value) of. Upload multiple images just use a for loop to add more RequestBody, as follows:
/**
* 上传图片
* create by weiang at 2016/5/20 17:33.
*/
private void upLoad() {
List<String> pathList = getPathList();//此处是伪代码,获取多张待上传图片的地址列表
String token = "ASDDSKKK19990SDDDSS";//用户token
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)//表单类型
.addFormDataPart(ParamKey.TOKEN, token);//ParamKey.TOKEN 自定义参数key常量类,即参数名
//多张图片
for (int i = 0; i < pathList.size(); i++) {
File file = new File(pathList.get(i));//filePath 图片地址
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
builder.addFormDataPart("imgfile"+i, file.getName(), imageBody);//"imgfile"+i 后台接收图片流的参数名
}
List<MultipartBody.Part> parts = builder.build().parts();
ApiUtil.uploadMemberIcon(parts).enqueue(new Callback<Result<String>>() {//返回结果
@Override
public void onResponse(Call<Result<String>> call, Response<Result<String>> response) {
AppUtil.showToastInfo(context, response.body().getMsg());
}
@Override
public void onFailure(Call<Result<String>> call, Throwable t) {
AppUtil.showToastInfo(context, "头像上传失败");
}
});
}
Method two: just pass a picture
In ApiService add the following method, in fact, a single pass MultipartBody.Part, and in this way a method like Post request @Field and @FieldMap the same reason
/**
* 上传头像
*/
@Multipart
@POST("/member/uploadMemberIcon.do")
Call<Result<String>> uploadMemberIcon(@Part MultipartBody.Part part, @Part(ParamKey.TOKEN) RequestBody token);
Add in the ApiUtil
/**
* 上传头像
*/
public static Call<Result<String>> uploadMemberIcon(MultipartBody.Part part, RequestBody token) {
return ApiUtil.getApiService().uploadMemberIcon(part,token);
}
Then pass parameters
private void upLoad() {
File file = new File(filePath);
String token = AppUtil.getString(ConstantKey.USER_TOKEN, "");
RequestBody tokenBody = RequestBody.create(MediaType.parse("text/plain"), token);
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("imgfile", file.getName(), imageBody);
ApiUtil.uploadMemberIcon(imageBodyPart,tokenBody).enqueue(new Callback<Result<String>>() {
@Override
public void onResponse(Call<Result<String>> call, Response<Result<String>> response) {
AppUtil.showToastInfo(context, response.body().getMsg());
}
@Override
public void onFailure(Call<Result<String>> call, Throwable t) {
AppUtil.showToastInfo(context, "头像上传失败");
}
});
}