Android 多文件上传

来源:互联网 发布:下载淘宝网到电脑桌面 编辑:程序博客网 时间:2024/04/30 11:20

上次在论坛里面回答过一个关于多文件上传的问题,然后就有好多同学私信问我具体的实现方式。由于人有点多并且工作有点忙,顾不上及时的回复大家,我在这里先说声抱歉了。

下面我把这块儿整理了一下,供大家参考。

前提


考虑到项目的单一性和安全稳定性,我在项目中用到的是鸿洋大神封装的OkHttpUtils。大家有不明白的可以先去看看http://blog.csdn.net/lmj623565791/article/details/49734867
在大神的Utils中也有关于文件上传的封装,但是需要你一个一个的添加,大家可以看一下:
OkHttpUtils.post()//    .addFile("mFile", "messenger_01.png", file)//    .addFile("mFile", "test1.txt", file2)//    .url(url)    .params(params)//    .headers(headers)//    .build()//    .execute(new MyStringCallback());


但是,在我们的项目中很多时候是不知道要具体上传几个文件的,比如说微信的朋友圈,用户可以上传1张照片,也可以上传9张,如果你针对这九中情况分别做封装的话,那我也不好说什么。但是为了省劲我做了如下的封装,目的就是,不管用户添加几张照片,我都放到一个list里面,有多少上传多少。

在鸿洋大神的基础上做一个简单封装

首先我们创建一个MyOkhttpUtils继承大神的OkHttpUtils类,并重写post方法。至于为什么后面会提到。下面看我封装的:
public class MyOkHttpUtils extends OkHttpUtils {    public MyOkHttpUtils(OkHttpClient okHttpClient) {        super(okHttpClient);    }    public static MyPostFromBuilder post()    {        return new MyPostFromBuilder();    }}
这里面的这个MyPostFromBuilder是什么鬼呢?这就是重点部分了,因为在大神的封装中关于上传的addFile()方法是在PostFromBuilder中的,它长这样:
public PostFormBuilder addFile(String name, String filename, File file)    {        files.add(new FileInput(name, filename, file));        return this;    }

大家可以看到,他这个方法添加的单个文件,那么我们要做的就是重写它,让他去加载一个list.。下面我们写一个自己的MyPostFromBuilder并继承PostFromBuilder,并重写addFile()方法,除了重写它以外,还需要重写build(),必须的,这个一定要记住,否则在你调用的时候,调用的就是父类的build了,这样你重写addFile就不起作用了。
public class MyPostFromBuilder extends PostFormBuilder {    private List<PostFormBuilder.FileInput> files = new ArrayList<>();    public MyPostFromBuilder addFile(List<String> imgList)    {        for (int i = 0;i <imgList.size();i++){            File file = new File(PhotoBitmapUtils.savePhotoToSD( PhotoBitmapUtils.getCompressPhoto(imgList.get(i),true), MyApplication.getContext()));            if (file.exists()) {               files.add(new PostFormBuilder.FileInput("img"+i, "feedback" + i+".png", file));           }        }        return this;    }    @Override    public RequestCall build()    {        return new PostFormRequest(url, tag, params, headers, files,id).build();    }}


好了,基本到这里就结束了。上面在重写MyOkHttpUtils的时候说过,我们重写了post方法,因为父类中返回的是PostFromBuilder,那就不符合我们的要求了对吧。

用法

好了,大神的封装使用方法我就不说了,下面看下我们的使用方法:
public void upDate(String version, String device, String content, List<String> imgList, OnRequestListener onRequestListener) {        String url = Utils.getSignUrl(MyURL.FEEDBACK);        MyOkHttpUtils.post()                .addFile(imgList)                .url(url)                .addParams("version",version)                .addParams("device",device)                .addParams("content",content)                .build()                .execute(new StringCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                        LogUtil.d("farley", "upDate.onError" + e.toString());                    }                    @Override                    public void onResponse(String response, int id) {                        LogUtil.d("farley", "upDate.success" + response);                    }                });    }

url 是我要提交的地址
imgList里面就是我要上传的图片地址,并且在这个方法里面,我们还可以上传其他参数,非常适合在朋友圈这种场景下使用。

结语

对于那些私信我的同学说声抱歉,真的是年底太忙了,简单回复吧,你们说我说的不清楚,但是确实是抽不出更多的时间去细说。今天记录下来,供大家参考吧。
对了说一下我为什么不用XUTILS了,因为xutils里面封装的东西太多了,有加载图片的,有访问网络的,有数据库等等,有的真的是用不到,或者性能不如其他,比如说加载图片我个人认为就不如Glide,所以我就抛弃他了,如果同学觉得,有需要说明一下xutils的多文件上传的话,也可以留言告诉我,我抽时间也写写

1 0
原创粉丝点击