使用七牛多圖上傳&踩坑&解決方案

很多項(xiàng)目都有上傳圖片的功能朴恳,有的保存在自己的服務(wù)器中挥唠,有的使用第三方存儲(chǔ)服務(wù)
這里我們使用七牛提供的對(duì)象存儲(chǔ)服務(wù)


七牛對(duì)象存儲(chǔ)

Android開(kāi)發(fā)上傳圖片到七牛的步驟

1. 集成七牛SDK

compile 'com.qiniu:qiniu-android-sdk:7.3.+'

2. 獲得上傳憑證token用于上傳圖片到七牛

這一步?jīng)]啥好說(shuō)的日杈,就是服務(wù)端會(huì)給你一個(gè)接口七冲,你使用該接口獲取token即可

3. 然后調(diào)用七牛的API上傳圖片

Configuration config = new Configuration.Builder()
                    .chunkSize(512 * 1024)        // 分片上傳時(shí)亲配,每片的大小蔓涧。 默認(rèn)256K
                    .putThreshhold(1024 * 1024)   // 啟用分片上傳閥值。默認(rèn)512K
                    .connectTimeout(10)           // 鏈接超時(shí)上渴。默認(rèn)10秒
                    .useHttps(true)               // 是否使用https上傳域名
                    .responseTimeout(60)          // 服務(wù)器響應(yīng)超時(shí)岸梨。默認(rèn)60秒
                    //.recorder(recorder)           // recorder分片上傳時(shí),已上傳片記錄器稠氮。默認(rèn)null
                    //.recorder(recorder, keyGen)   // keyGen 分片上傳時(shí)曹阔,生成標(biāo)識(shí)符,用于片記錄器區(qū)分是那個(gè)文件的上傳記錄
                    //.zone(FixedZone.zone0)        // 設(shè)置區(qū)域括袒,指定不同區(qū)域的上傳域名次兆、備用域名、備用IP锹锰。
                    .build();
// 重用uploadManager一般地芥炭,只需要?jiǎng)?chuàng)建一個(gè)uploadManager對(duì)象
UploadManager uploadManager = new UploadManager(config);
//data = <File對(duì)象、或 文件路徑恃慧、或 字節(jié)數(shù)組>
//String key = <指定七牛服務(wù)上的文件名园蝠,或 null>;
//String token = <從服務(wù)端獲取>;
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);
注意:上傳圖片的時(shí)候報(bào)錯(cuò)401 bad token
{ver:7.3.10,ResponseInfo:1514100119681772,status:401, reqId:WgYAAGJX5-KaKgMV, xlog:body:1;UP:2/401, xvia:vdn-fjfz-tel-1-2, host:upload-z2.qiniup.com, path:/, ip:27.155.94.248, port:443, duration:119 s, time:1514100744, sent:28058,error:bad token},
          {"error":"bad token"}

這里我檢查了很多遍,也和服務(wù)端再三確認(rèn)token是沒(méi)有錯(cuò)誤的善延,但是為啥會(huì)報(bào)401 bad token
然后ios端的告訴我少态,要對(duì)token字符串進(jìn)行處理,去掉token中的換行符和空格符

String a = qiNiuToken.replace("\\s", "");
String token = a.replace("\n", "");

處理之后再次執(zhí)行易遣,Upload Success成功了彼妻!
這里還是有疑問(wèn)為什么明明Log打印出來(lái)的token字符串根本沒(méi)看到換行符和空格符啊。豆茫。侨歉。。揩魂。

七牛上傳多張圖片的問(wèn)題

問(wèn)題一:怎么解決多圖同時(shí)上傳全部成功監(jiān)聽(tīng)

假設(shè)場(chǎng)景:

現(xiàn)在有一個(gè)新增商品頁(yè)面幽邓,該頁(yè)面需要先上傳產(chǎn)品的5張細(xì)節(jié)圖,拿到5張圖片的url火脉,才能提交新增商品牵舵。

問(wèn)題:

必須要監(jiān)聽(tīng)所有圖片上傳成功,才能執(zhí)行新增商品忘分,但問(wèn)題是七牛的對(duì)象上傳接口默認(rèn)一次只能傳一個(gè)棋枕。
總不可能同步的辦法去一張張上傳圖片,一張傳成功再傳下一張妒峦。這樣當(dāng)圖片很多的時(shí)候很沒(méi)效率浪費(fèi)時(shí)間。

思路:

七牛有提供了上傳進(jìn)度回調(diào)的API兵睛,當(dāng)進(jìn)度percent等于1.0說(shuō)明上傳完成
一張圖片完成肯骇,任務(wù)完成計(jì)數(shù)+1,當(dāng)計(jì)數(shù)等于圖片的數(shù)量時(shí)祖很,說(shuō)明全圖圖片上傳完成笛丙,執(zhí)行新增商品操作

uploadManager.put(data, key, token,handler,
    new UploadOptions(null, null, false,
        new UpProgressHandler(){
            public void progress(String key, double percent){
                Log.i("qiniu", key + ": " + percent);//上傳進(jìn)度
            }
        }, null));
做法如下:

將所有圖片保存在一個(gè)容器中,foreach循環(huán)執(zhí)行上傳圖片的操作

聲明一個(gè)變量來(lái)統(tǒng)計(jì)圖片上傳完成的張數(shù)
private int uploadTaskCount;//七牛上傳圖片完成計(jì)數(shù)

Log.i("qiniu", key + ": " + percent);
if (percent == 1.0)//上傳進(jìn)度等于1.0說(shuō)明上傳完成,通知 完成任務(wù)+1
  {
    Message message = Message.obtain();
    message.what = QI_NIU_UPLOAD_OK;
    handler.sendMessage(message);
  }
Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case QI_NIU_UPLOAD_OK://七牛上傳圖片完成計(jì)數(shù)
                    uploadTaskCount++;
                    Log.e("uploadTaskCount", uploadTaskCount + "");
                    if (uploadTaskCount == list.size())//容器中圖片全部上傳完成
                    {
                        //新增商品
                    }
                    break;
            }
        }
    };

問(wèn)題二:有序圖片上傳假颇,返回的URL無(wú)序

假設(shè)場(chǎng)景:

現(xiàn)在有一個(gè)新增商品頁(yè)面胚鸯,該頁(yè)面需要先上傳產(chǎn)品的1張主圖和2張細(xì)節(jié)圖,拿到3張圖片的url保存到url容器中上傳服務(wù)端笨鸡,但是保存url的容器的要求姜钳,順序依次為主圖,細(xì)節(jié)圖形耗,細(xì)節(jié)圖哥桥。

問(wèn)題:

在問(wèn)題一中已經(jīng)可以解決多圖同時(shí)上傳的問(wèn)題,但是 返回的url是無(wú)序的
例如:
圖片文件容器中有a.jpg(10M)激涤,b.jpg(0.5M)拟糕,c.jpg(2M)這三張圖片,a為主圖,bc為細(xì)節(jié)圖送滞。同時(shí)上傳侠草,可能會(huì)出現(xiàn)b.jpg先傳完添加url到url容器中,然后c.jpg傳完添加url到容器中犁嗅,最后才添加a.jpg的url到容器中边涕。這與服務(wù)端要求的url順序,是不符合的

思路

七牛上傳的API中可以指定上傳的圖片在七牛服務(wù)上的文件名
String key = <指定七牛服務(wù)上的文件名愧哟,或 null>;

ata = <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)

這樣就可以在上傳的時(shí)候把原來(lái)的圖片名+時(shí)間戳指定該圖片在七牛服務(wù)上的文件名
全部圖片上傳完成后得到保存所有圖片的url容器,利用url中的時(shí)間戳對(duì)保存url的容器從新排序甘改。時(shí)間戳最早的就是主圖旅东,放在容器第一個(gè)元素。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末十艾,一起剝皮案震驚了整個(gè)濱河市抵代,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忘嫉,老刑警劉巖荤牍,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庆冕,居然都是意外死亡康吵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門访递,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晦嵌,“玉大人,你說(shuō)我怎么就攤上這事拷姿〔言兀” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵跌前,是天一觀的道長(zhǎng)棕兼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)抵乓,這世上最難降的妖魔是什么伴挚? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任靶衍,我火速辦了婚禮,結(jié)果婚禮上茎芋,老公的妹妹穿的比我還像新娘颅眶。我一直安慰自己,他們只是感情好田弥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布涛酗。 她就那樣靜靜地躺著,像睡著了一般偷厦。 火紅的嫁衣襯著肌膚如雪商叹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天只泼,我揣著相機(jī)與錄音剖笙,去河邊找鬼。 笑死请唱,一個(gè)胖子當(dāng)著我的面吹牛弥咪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播十绑,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼聚至,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了本橙?” 一聲冷哼從身側(cè)響起扳躬,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甚亭,沒(méi)想到半個(gè)月后坦报,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狂鞋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了潜的。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骚揍。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啰挪,靈堂內(nèi)的尸體忽然破棺而出信不,到底是詐尸還是另有隱情,我是刑警寧澤亡呵,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布抽活,位于F島的核電站,受9級(jí)特大地震影響锰什,放射性物質(zhì)發(fā)生泄漏下硕。R本人自食惡果不足惜丁逝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梭姓。 院中可真熱鬧霜幼,春花似錦、人聲如沸誉尖。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铡恕。三九已至琢感,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間探熔,已是汗流浹背驹针。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祭刚,地道東北人牌捷。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涡驮,于是被迫代替她去往敵國(guó)和親暗甥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,860評(píng)論 25 707
  • 前言 項(xiàng)目中有一處功能是從相冊(cè)中選取圖片捉捅,然后上傳至七牛服務(wù)器撤防。這兒是以前別人做的,上次功能有小改動(dòng)棒口,發(fā)現(xiàn)這兒的邏...
    Wang66閱讀 4,543評(píng)論 5 21
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理寄月,服務(wù)發(fā)現(xiàn),斷路器无牵,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 今天主要系統(tǒng)的復(fù)習(xí)了心理測(cè)驗(yàn)技能漾肮、心理咨詢技能,對(duì)于測(cè)驗(yàn)的相關(guān)計(jì)算題進(jìn)行了系統(tǒng)的練習(xí)茎毁,對(duì)于心理咨詢的相關(guān)簡(jiǎn)答題也有...
    牙膏藍(lán)閱讀 96評(píng)論 0 0
  • 每次從菜市場(chǎng)出來(lái)克懊,都想為自已的早餐胃留一點(diǎn)點(diǎn)空間,來(lái)這家店里點(diǎn)一碗湯粉或是一份腸粉七蜘,為的是不給從這里經(jīng)過(guò)因?yàn)闆](méi)吃到...
    阿阿閑閱讀 335評(píng)論 0 0