Android端使用xUtils3.0實現(xiàn)文件上傳


privatevoidupLoadOnClick(View v) {? ? ? ? String upUrl ="/mnt/sdcard/pic/test.jpg";//指定要上傳的文件finalProgressDialog dia =newProgressDialog(this);? ? ? ? dia.setMessage("加載中....");? ? ? ? dia.show();? ? ? ? RequestParams params =newRequestParams(upUrl);? ? ? ? params.addBodyParameter("file",newFile(upUrl));? ? ? ? x.http().post(params,newCallback.CommonCallback() {@OverridepublicvoidonSuccess(String result) {//加載成功回調(diào)烁落,返回獲取到的數(shù)據(jù)Log.i(TAG,"onSuccess: "+ result);? ? ? ? ? ? }@OverridepublicvoidonFinished() {? ? ? ? ? ? ? ? dia.dismiss();//加載完成}@OverridepublicvoidonCancelled(CancelledException cex) {? ? ? ? ? ? }@OverridepublicvoidonError(Throwable ex,booleanisOnCallback) {? ? ? ? ? ? }? ? ? ? });? ? }


我在項目中通過以上方法進行圖片上傳,發(fā)現(xiàn)有點小問題,或許是我把這個方法使 用不到位剔猿。

在與服務(wù)器聯(lián)調(diào)時,同事總是告訴我沒有收到文件流數(shù)據(jù)俭正,結(jié)果肯定是上傳失敗谷扣。后來繼續(xù)看代碼跟進,發(fā)現(xiàn)通過

` params.addBodyParameter("file", new File(upUrl));`

這種方式傳遞文件數(shù)據(jù)芹彬,默認的請求數(shù)據(jù)類型并不是文件類型所需要的multipart/form-data類型數(shù)據(jù)蓄髓。

通過看相應(yīng)源碼,我們在使用xUtils實現(xiàn)網(wǎng)絡(luò)請求時舒帮,通過

`RequestParams params = new RequestParams(Constants.ADD_ZONE_PLANE);`創(chuàng)建請求会喝,然后通過

` params.setRequestBody(body);`傳遞請求參數(shù)陡叠。

其實setRequestBody(RequestBody requestBody)方法是調(diào)用RequestParams的父類BaseParams中的方法:

publicvoidsetRequestBody(RequestBody requestBody) {this.requestBody = requestBody;? ? }


考慮是參數(shù)數(shù)據(jù)類型問題,我們就從傳遞參數(shù)RequestBody入手好乐,發(fā)現(xiàn)在xUtils中匾竿,默認有:

FileBody,InputStreamBody,MultipartBody及StringBody等幾種類型的請求Body,當然這些都是RequestBody的子類 蔚万。

發(fā)現(xiàn)MultipartBody類型中岭妖,有這個方法:

privatevoidgenerateContentType() {? ? ? ? String boundaryPostfix = Double.toHexString(Math.random() *0xFFFF);? ? ? ? boundaryPostfixBytes = boundaryPostfix.getBytes();? ? ? ? contentType ="multipart/form-data; boundary="+newString(BOUNDARY_PREFIX_BYTES) + boundaryPostfix;? ? }


看到返回的類型是multipart/form-data...,正是我想要的反璃,所以請求參數(shù)就從MultipartBody入手考慮上傳文件昵慌。

MultipartBody類的構(gòu)造方法如下:

//參數(shù)分別是要傳入的數(shù)據(jù),和數(shù)據(jù)編碼類型 public MultipartBody(List multipartParams, String charset) {if(!TextUtils.isEmpty(charset)) {? ? ? ? ? ? this.charset = charset;? ? ? ? }? ? ? ? this.multipartParams = multipartParams;? ? ? ? generateContentType();...}


從構(gòu)造方法需要的參數(shù)開始淮蜈,我們一步一步地實現(xiàn)MultipartBody所需要的數(shù)據(jù)斋攀。

//創(chuàng)建List對象Listlist=newArrayList<>();//給list中添加數(shù)據(jù),filePah是上傳的文件路徑梧田,比如sd卡中圖片list.add(newKeyValue("file",newFile(filePah)));//文件流數(shù)據(jù)//其它參數(shù)淳蔼,根據(jù)項目而定,比如我的項目中要傳入的參數(shù)是json格式的list.add(newKeyValue("parameters", json.toString()));//創(chuàng)建MultipartBodyMultipartBody body=newMultipartBody(list,"UTF-8");//添加請求參數(shù)params.setRequestBody(body);


這樣就可以實現(xiàn)文件上傳裁眯,最后貼下整個請求方法的相關(guān)代碼:

//要傳遞給服務(wù)器的json格式參數(shù)JSONObject json =newJSONObject();try{? ? ? ? ? ? json.put("devId", id);? ? ? ? ? ? json.put("devName", devName);? ? ? ? ? ? json.put("keyWord", keyWord);? ? ? ? }catch(JSONException e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }//構(gòu)建RequestParams對象鹉梨,傳入請求的服務(wù)器地址URLRequestParams params =newRequestParams(Constants.UPLOAD_FILE);? ? ? ? params.setAsJsonContent(true);? ? ? ? List list =newArrayList<>();? ? ? ? list.add(newKeyValue("file",newFile(filePah)));? ? ? ? list.add(newKeyValue("parameters", json.toString()));? ? ? ? MultipartBody body =newMultipartBody(list,"UTF-8");? ? ? ? params.setRequestBody(body);? ? ? ? x.http().post(params,neworg.xutils.common.Callback.CommonCallback() {@OverridepublicvoidonSuccess(String result) {? ? ? ? ? ? ? ? LogUtil.e("請求結(jié)果:"+ result);? ? ? ? ? ? }@OverridepublicvoidonFinished() {//上傳完成}@OverridepublicvoidonCancelled(CancelledException cex) {//取消上傳}@OverridepublicvoidonError(Throwable ex,booleanisOnCallback) {//上傳失敗LogUtil.e("請求失敗:"+ ex.toString());? ? ? ? ? ? }? ? ? ? });

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穿稳,一起剝皮案震驚了整個濱河市存皂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逢艘,老刑警劉巖旦袋,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異它改,居然都是意外死亡疤孕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門央拖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胰柑,“玉大人,你說我怎么就攤上這事爬泥〖硖郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵袍啡,是天一觀的道長踩官。 經(jīng)常有香客問我,道長境输,這世上最難降的妖魔是什么蔗牡? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任颖系,我火速辦了婚禮,結(jié)果婚禮上辩越,老公的妹妹穿的比我還像新娘嘁扼。我一直安慰自己,他們只是感情好黔攒,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布趁啸。 她就那樣靜靜地躺著,像睡著了一般督惰。 火紅的嫁衣襯著肌膚如雪不傅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天赏胚,我揣著相機與錄音访娶,去河邊找鬼。 笑死觉阅,一個胖子當著我的面吹牛崖疤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播典勇,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼戳晌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痴柔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤疫向,失蹤者是張志新(化名)和其女友劉穎咳蔚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搔驼,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡谈火,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舌涨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糯耍。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖囊嘉,靈堂內(nèi)的尸體忽然破棺而出温技,到底是詐尸還是另有隱情,我是刑警寧澤扭粱,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布舵鳞,位于F島的核電站,受9級特大地震影響琢蛤,放射性物質(zhì)發(fā)生泄漏蜓堕。R本人自食惡果不足惜抛虏,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望套才。 院中可真熱鬧迂猴,春花似錦、人聲如沸背伴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挂据。三九已至以清,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崎逃,已是汗流浹背掷倔。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留个绍,地道東北人勒葱。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像巴柿,于是被迫代替她去往敵國和親凛虽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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