标题: 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));}}

上传胡结果:
------[\tmp\upload__4348b3f0_1528c3d9735__8000_00000038.tmp,\tmp\upload__4348b3f0_1528c3d9735__8000_00000040.tmp]
------["share.png"]
2016-1-29 16:59:04 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Removing file file \tmp\upload__4348b3f0_1528c3d9735__8000_00000038.tmp
2016-1-29 16:59:04 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Removing file file \tmp\upload__4348b3f0_1528c3d9735__8000_00000040.tmp


  总共就这些吧。有问题大家在下面说。QQ1561281670

代码下载地址



追加:

多图上传的一种简单那写法:

public static void uploadMany(ArrayList paths,String desp){        Map photos = new HashMap<>();        if (paths.size()>0) {            for (int i=0;i stringCall = apiManager.uploadImage(desp, photos);        stringCall.enqueue(new Callback() {            @Override            public void onResponse(Call call, Response response) {                Log.d(TAG, "onResponse() called with: " + "call = [" + call + "], response = [" + response + "]");            }            @Override            public void onFailure(Call call, Throwable t) {                Log.d(TAG, "onFailure() called with: " + "call = [" + call + "], t = [" + t + "]");            }        });    }

这样洗是不是比上面的好多了。如果再有什么好的写法,请提出来。我在改进

更多相关文章

  1. react-native-image-picker图片上传
  2. Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上
  3. Android(安卓)通过网络图片路径查看图片实例详解
  4. Android实现图片叠加效果的两种方法
  5. Android之Gallery和ImageSwitcher结合的用法
  6. QT on Android(安卓)开机动画和开机图片显示
  7. Matisse Android(安卓)图片选择器
  8. 【Android(安卓)开发教程】GridView
  9. android使用http协议实现文件的上传

随机推荐

  1. android在java中动态改变控件大小
  2. ffmpeg移植到andriod
  3. android mmc register to platform
  4. android如果用ListView做一个表格形式
  5. Android 文件存储及常见问题解决
  6. Android中得到view在父容器中的位置下标
  7. 兼容android Q存图片到相册
  8. Android ScrollView滑动到顶部和滑动到底
  9. Android必会小功能总结
  10. 观摩Android最高权力的Context通用性接口