android 七牛多圖上傳

假裝是圖片

前言:
????由于后臺(tái)接收POST提交數(shù)據(jù)格式為application/x-www-form-urlencoded,帶文件要用form-data導(dǎo)致圖片上傳不了服務(wù)器,首先我們看下:

form編碼方式application/x-www-form-urlencoded和multipart/form-data的區(qū)別

form元素有個(gè)enctype屬性,可以指定數(shù)據(jù)編碼方式,有如下三種:

1. application/x-www-form-urlencoded: 表單數(shù)據(jù)編碼為鍵值對(duì),&分隔

2. multipart/form-data: 表單數(shù)據(jù)編碼為一條消息,每個(gè)控件對(duì)應(yīng)消息的一部分

3. text/plain: 表單數(shù)據(jù)以純文本形式進(jìn)行編碼

決定使用七牛來解決這個(gè)問題,在使用過程中,我集成七牛SDK,并閱讀文檔,發(fā)現(xiàn)并沒有批量上傳圖片方式,在表單上傳方法只提供了單圖上傳方法,我第一瞬間內(nèi)心就拒絕for循環(huán)遍歷上傳的...

簡(jiǎn)單上傳
//指定zone的具體區(qū)域 
//FixedZone.zone0   華東機(jī)房
//FixedZone.zone1   華北機(jī)房
//FixedZone.zone2   華南機(jī)房
//FixedZone.zoneNa0 北美機(jī)房
//自動(dòng)識(shí)別上傳區(qū)域 
//AutoZone.autoZone
//Configuration config = new Configuration.Builder()
//.zone(Zone.autoZone)
//.build();
//UploadManager uploadManager = new UploadManager(config);
data = <File對(duì)象、或 文件路徑、或 字節(jié)數(shù)組>
String key = <指定七牛服務(wù)上的文件名,或 null>;
String token = <從服務(wù)端SDK獲取>;
uploadManager.put(data, key, token,
    new UpCompletionHandler() {
        @Override
        public void complete(String key, ResponseInfo info, JSONObject res) {
            //res包含hash、key等信息,具體字段取決于上傳策略的設(shè)置
             if(info.isOK()) {
                Log.i("qiniu", "Upload Success");
             } else {
                Log.i("qiniu", "Upload Fail");
                //如果失敗,這里可以把info信息上報(bào)自己的服務(wù)器,便于后面分析上傳錯(cuò)誤原因
             }
             Log.i("qiniu", key + ",\r\n " + info + ",\r\n " + res);
            }
        }, null);

我就想到遞歸,隊(duì)列,線程...這些名詞就浮現(xiàn)在腦海中
下面帶著讀友從引用Gradle開始
1.注冊(cè)/登錄開發(fā)者中心
2.引用七牛包

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

3.模擬獲取手機(jī)圖片資源

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

4.這里利用Handler來體現(xiàn)它的結(jié)構(gòu)清晰,功能明確,圖片資源上傳七牛后,把回調(diào)的圖片路徑存放Message中,handle發(fā)送,頁(yè)面刷新數(shù)據(jù).

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.啟動(dòng)線程來實(shí)現(xiàn)批量上傳資源
Thread() run()方法保證了線程的有序性

/**
     * 描述: 七牛上傳多圖
     * @param imagePath 圖片的本地路徑
     * @param picSize 上傳圖片總數(shù)量
     * @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");
                // 設(shè)置圖片名字
                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集合中圖片上傳完成后,發(fā)送handler消息回主線程進(jìn)行其他操作
                                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來實(shí)現(xiàn)

  • 首先我贊同的是可以把Handle換成EventBus,Eventbus能夠解耦,把本該有聯(lián)系的需要傳引用的給簡(jiǎn)化, 由它來分發(fā)事件了,不需要Handle來分布事件,簡(jiǎn)化了它的事件繁瑣;
  • RxJava與七牛結(jié)合封裝進(jìn)行上傳,對(duì)于RxJava的話,我是真沒接觸過,也領(lǐng)略過它的強(qiáng)大,表示要學(xué)習(xí)一波~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容