本文为大家分享了 Android Retrofit 2.0框架上传图片解决方案,具体内容如下

1.单张图片的上传

/**   * 上传一张图片   * @param description   * @param imgs   * @return   */  @Multipart  @POST("/upload")  Call uploadImage(@Part("fileName") String description,         @Part("file\"; filename=\"image.png\"")RequestBody imgs);

2.多张图片的上传

/**  * 上传三张图片  * @param description  * @param imgs  * @param imgs1  * @param imgs3  * @return  */  @Multipart  @POST("/upload")  Call uploadImage(@Part("fileName") String description,        @Part("file\"; filename=\"image.png\"")RequestBody imgs,        @Part("file\"; filename=\"image.png\"")RequestBody imgs1,        @Part("file\"; filename=\"image.png\"")RequestBody imgs3);

注意:目前是提供传3张,要想多上传目前我发现的方法就是想要多传一张,就多增加一个参数
@Part("file\"; filename=\"image.png\"")RequestBody imgs,以此类推。

大家看到上面觉得写法很漏,但是用于能力有限,只能想到这样。用Java中的可变参数解决之后,就只能传一张。不能多张。

@Multipart  @POST("/upload")  Call uploadImage(@Part("fileName") String description,        @Part("file\"; filename=\"image.png\"")RequestBody ...imgs);

 调用:
Call call = apiManager.uploadImage( m[0],requestBody1,requestBody2,null); 

这样写看上去很是高端,不幸的是只能传一张

3.最后是实现胡过程
3.1创建FileUploadService接口

public interface FileUploadService { /**  * 上传一张图片  * @param description  * @param imgs  * @return  */ @Multipart @POST("/upload") Call uploadImage(@Part("fileName") String description,        @Part("file\"; filename=\"image.png\"")RequestBody imgs);  /**  * 上传三张图片  * @param description  * @param imgs  * @param imgs1  * @param imgs3  * @return  */ @Multipart @POST("/upload") Call uploadImage(@Part("fileName") String description,        @Part("file\"; filename=\"image.png\"")RequestBody imgs,        @Part("file\"; filename=\"image.png\"")RequestBody imgs1,        @Part("file\"; filename=\"image.png\"")RequestBody imgs3);}

 3.2创建Retrofit对象

private static final Retrofit sRetrofit = new Retrofit .Builder()   .baseUrl(ENDPOINT)   .addConverterFactory(GsonConverterFactory.create())//   .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 使用RxJava作为回调适配器   .build();  private static final FileUploadService apiManager = sRetrofit.create(FileUploadService.class);

 3.3调用上传的方法

public static void upload(String path){  String descriptionString = "hello, this is description speaking";  String[] m = new String[2]; m[0]= "share.png"; m[1]= "Screenshot_20160128-140709.png"; File[] ssssss= new File[2]; File file1 = new File("/storage/emulated/0/sc/share.png"); File file = new File("/storage/emulated/0/Pictures/ScreenShots/Screenshot_20160128-140709.png"); ssssss[0]=file; ssssss[0]=file1; RequestBody requestBody[] = new RequestBody[3]; RequestBody requestBody1 =   RequestBody.create(MediaType.parse("multipart/form-data"), file); RequestBody requestBody2 =   RequestBody.create(MediaType.parse("multipart/form-data"), file1); requestBody[0]=requestBody1; requestBody[1]=requestBody2; Call call = apiManager.uploadImage( m[0],requestBody1,requestBody2,null); call.enqueue(new Callback() {  @Override  public void onResponse(Response response, Retrofit retrofit) {   Log.v("Upload", response.message());   Log.v("Upload", "success");  }   @Override  public void onFailure(Throwable t) {   Log.e("Upload", t.toString());  } }); }

4.服务器段代码:
服务器用的是struts接收:

@Controllerpublic class GetToken extends ActionSupport {   /**  *  */ private static final long serialVersionUID = 1L; private File[] file; private String[] fileName; public File[] getFile() {  return file; } public void setFile(File[] file) {  this.file = file; } public String[] getFileName() {  return fileName; } public void setFileName(String[] fileName) {  this.fileName = fileName; }   @Action("/upload") public void login() {  System.out.println("------"+Arrays.toString(file));  System.out.println("------"+Arrays.toString(fileName)); }         }

上传视频,随便找的一个接口,只是举个例子而已

@Multipart    @POST("Fmsg_add_video.asp")    Observable newVideoAdd(@retrofit.http.Part("token") RequestBody token,                                       @retrofit.http.Part("role") RequestBody role,                                       @retrofit.http.Part("pk_image_news_image_id") RequestBody pk_image_news_id,                                       @retrofit.http.PartMap Map params);
 public Observable addVideo(String role, String pk_image_news_id, String path, String videoName) {        RequestBody token = RequestBody.create(null, getPreferencesHelper().getAccessToken());        RequestBody roleR = RequestBody.create(null, role);        RequestBody pk_image_news_idR = RequestBody.create(null, pk_image_news_id);        File file = new File(path);        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);        Map video = new HashMap<>();        String key = "file1\";filename=\"" + videoName;        video.put(key, requestBody);        return mRibotService.newVideoAdd(token, roleR, pk_image_news_idR, video);    }

以上就是本文的全部内容,希望对大家的学习有所帮助。


更多相关文章

  1. Android音乐播放器制作
  2. 2011.11.25——— android ndk 坑爹的cygwin
  3. Android调用系统短信发送界面并预设接收号码、短信内容
  4. Android(安卓)matrix 控制图片的旋转、缩放、移动
  5. Android(安卓)Wifi模块分析(三)
  6. Android中dispatchDraw分析
  7. Android四大基本组件介绍与生命周期
  8. android拍照与读取相册
  9. Android(安卓)报错:Caused by: android.os.FileUriExposedExcepti

随机推荐

  1. Android高手进阶教程(二)之----Android(
  2. 《安卓开发必知的50个技巧》读书笔记
  3. Android音频开发(3):如何播放一帧音频
  4. 安卓新手之路——关于layout一些属性的整
  5. 教你如何在 Android(安卓)使用多线程下载
  6. Android中的Apk的加固(加壳)原理解析和实
  7. [Android(安卓)Studio系列(五)] Android(
  8. Android(安卓)2.2 源码结构分析
  9. Android之怎么使用SQLite数据库(增、删、
  10. Android(安卓)Studio 打包jar,aar