Retrofit上传文件
来源:互联网 发布:数学英语词典知乎 编辑:程序博客网 时间:2024/06/06 09:27
Retrofit上传文件
Retrofit上传文件,哥找了好多教程,到处是坑,终于有结果了,附上博主地址,感谢
http://blog.csdn.net/ITjianghuxiaoxiong/article/details/52135748?locationNum=3&fps=1
第一步,添加gradle引用
compile ‘com.squareup.retrofit2:converter-gson:2.0.1’
compile ‘com.squareup.retrofit2:retrofit:2.0.1’
第二步,请求接口
/** * 数据请求服务 * 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); }
第三步,请求工具类
/** * 数据请求控制工具类 * 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); } }
接下来是图片上传关键代码
方法一(推荐使用):
在service添加请求方法,注意要使用@Multipart 和@POST 注解
/** * 上传头像 */ @Multipart @POST("/member/uploadMemberIcon.do") Call<Result<String>> uploadMemberIcon(@Part List<MultipartBody.Part> partList);
通过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, "头像上传失败"); } }); }
添加多个字符串参数,只需要在builder.addFormDataPart(key,value)的形式追加即可。多张图片上传只需要用for循环添加多个RequestBody即可,如下:
/** * 上传图片 * 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, "头像上传失败"); } }); }
方法二:只传一张图片
ApiService 中添加如下方法,其实就是单传一个MultipartBody.Part, 这种方式和方法一就像是Post请求中的@Field和@FieldMap一样道理
/** * 上传头像 */ @Multipart @POST("/member/uploadMemberIcon.do") Call<Result<String>> uploadMemberIcon(@Part MultipartBody.Part part, @Part(ParamKey.TOKEN) RequestBody token);
在ApiUtil中添加
/** * 上传头像 */ public static Call<Result<String>> uploadMemberIcon(MultipartBody.Part part, RequestBody token) { return ApiUtil.getApiService().uploadMemberIcon(part,token); }
然后传参数
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, "头像上传失败"); } }); }
阅读全文
0 0
- Retrofit 2.0文件上传
- 使用Retrofit上传文件
- Retrofit上传文件
- Retrofit 上传文件
- retrofit 上传文件
- Retrofit上传文件
- retrofit+rxjava 上传文件
- Retrofit上传文件
- Retrofit 上传文件
- Retrofit 2.0 文件上传类型
- [Server]App-Retrofit上传文件
- Android Retrofit 上传文件图片
- retrofit显示上传文件进度
- rxjava2 + retrofit上传文件示例
- retrofit上传获取文件上传进度
- Retrofit 2.0 单文件、多文件上传
- Retrofit(三)、使用Retrofit上传文件并带进度
- Retrofit 2.0 文件上传类型错误
- Android
- 类对象只能在堆上分配空间的方法
- HDU 2709 Sumsets(递推)
- cc1101 简单入门
- NGUI之组件获取
- Retrofit上传文件
- 你知道Python 吗?
- Retrofit下载文件
- 常用导数
- 随机采样 蒙特卡洛
- 在ubuntu下安装qt4.8.5和qtcreator2.8.0
- Windows环境下Code::Blocks中成功配置MySQL Connector/C连接MySQL数据库
- HDU 2701 Max Factor
- Java 修饰符