美文网首页
android 七牛多图上传

android 七牛多图上传

作者: JayGengi | 来源:发表于2018-07-27 20:15 被阅读0次
假装是图片

前言:
    由于后台接收POST提交数据格式为application/x-www-form-urlencoded,带文件要用form-data导致图片上传不了服务器,首先我们看下:

form编码方式application/x-www-form-urlencoded和multipart/form-data的区别

form元素有个enctype属性,可以指定数据编码方式,有如下三种:

1. application/x-www-form-urlencoded: 表单数据编码为键值对,&分隔

2. multipart/form-data: 表单数据编码为一条消息,每个控件对应消息的一部分

3. text/plain: 表单数据以纯文本形式进行编码

决定使用七牛来解决这个问题,在使用过程中,我集成七牛SDK,并阅读文档,发现并没有批量上传图片方式,在表单上传方法只提供了单图上传方法,我第一瞬间内心就拒绝for循环遍历上传的...

简单上传
//指定zone的具体区域 
//FixedZone.zone0   华东机房
//FixedZone.zone1   华北机房
//FixedZone.zone2   华南机房
//FixedZone.zoneNa0 北美机房
//自动识别上传区域 
//AutoZone.autoZone
//Configuration config = new Configuration.Builder()
//.zone(Zone.autoZone)
//.build();
//UploadManager uploadManager = new UploadManager(config);
data = <File对象、或 文件路径、或 字节数组>
String key = <指定七牛服务上的文件名,或 null>;
String token = <从服务端SDK获取>;
uploadManager.put(data, key, token,
    new UpCompletionHandler() {
        @Override
        public void complete(String key, ResponseInfo info, JSONObject res) {
            //res包含hash、key等信息,具体字段取决于上传策略的设置
             if(info.isOK()) {
                Log.i("qiniu", "Upload Success");
             } else {
                Log.i("qiniu", "Upload Fail");
                //如果失败,这里可以把info信息上报自己的服务器,便于后面分析上传错误原因
             }
             Log.i("qiniu", key + ",\r\n " + info + ",\r\n " + res);
            }
        }, null);

我就想到递归,队列,线程...这些名词就浮现在脑海中
下面带着读友从引用Gradle开始
1.注册/登录开发者中心
2.引用七牛包

implementation 'com.qiniu:qiniu-android-sdk:7.3.12'

3.模拟获取手机图片资源

 //存放图片路径的集合
                if (pathResult.size() > 0) {
                    int picSize = pathResult.size();
                    for (int i = 0; i < picSize; i++) {
                        QiNiuUtils.getUpimg(pathResult.get(i),picSize,mHandler);
                    }
                }

4.这里利用Handler来体现它的结构清晰,功能明确,图片资源上传七牛后,把回调的图片路径存放Message中,handle发送,页面刷新数据.

Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    Bundle bundle = msg.getData();
                    if(null != bundle){
                        resultPathResult = bundle.getStringArrayList("resultImagePath");
                        Log.d("RentalReleaseActivity",resultPathResult.size()+"======"+resultPathResult.toString());
                    }
                    break;
                default:
                    break;
            }
        }
    };

5.启动线程来实现批量上传资源
Thread() run()方法保证了线程的有序性

/**
     * 描述: 七牛上传多图
     * @param imagePath 图片的本地路径
     * @param picSize 上传图片总数量
     * @param mHandler Handler
     * @author JayGengi
     * @date 2018/7/27 0027 下午 5:26
     */
    public static ArrayList<String> resultImagePath = new ArrayList<>();
    public static void getUpimg(String imagePath,int picSize,Handler mHandler) {

        new Thread() {
            private SimpleDateFormat sdf;
            private UploadManager uploadManager;
            public void run() {
                // 图片上传到七牛 重用 uploadManager
                uploadManager = new UploadManager();
                sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                // 设置图片名字
                String key = "icon_" +imagePath+""+sdf.format(new Date());
                uploadManager.put(imagePath, key,token,
                        new UpCompletionHandler() {
                            @Override
                            public void complete(String key, ResponseInfo info,
                                                 JSONObject res) {
                                // 七牛返回的文件名
                                resultImagePath.add(key);
                                //将七牛返回图片的文件名添加到list集合中
                                //list集合中图片上传完成后,发送handler消息回主线程进行其他操作
                                if (picSize == resultImagePath
                                        .size()) {
                                    Bundle bundle = new Bundle();
                                    bundle.putStringArrayList("resultImagePath",resultImagePath);
                                    Message message = new Message();
                                    message.what = 1;
                                    message.setData(bundle);
                                    mHandler.sendMessage(message);
                                }
                            }
                        }, null);
            }
        }.start();
    }

Question:
同事建议集合EventBus和Rxjava来实现

  • 首先我赞同的是可以把Handle换成EventBus,Eventbus能够解耦,把本该有联系的需要传引用的给简化, 由它来分发事件了,不需要Handle来分布事件,简化了它的事件繁琐;
  • RxJava与七牛结合封装进行上传,对于RxJava的话,我是真没接触过,也领略过它的强大,表示要学习一波~

相关文章

网友评论

      本文标题:android 七牛多图上传

      本文链接:https://www.haomeiwen.com/subject/slygmftx.html