Android使用xUtils3.0實(shí)現(xiàn)文件上傳
幾個月前寫過一篇博客《xUtils3.0框架學(xué)習(xí)筆記》 ,上面也有記錄通過xUtils實(shí)現(xiàn)文件上傳的使用方法,代碼如下:
private void upLoadOnClick(View v) { String upUrl = "/mnt/sdcard/pic/test.jpg";//指定要上傳的文件 final ProgressDialog dia = new ProgressDialog(this); dia.setMessage("加載中...."); dia.show(); RequestParams params = new RequestParams(upUrl); params.addBodyParameter("file", new File(upUrl)); x.http().post(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { //加載成功回調(diào),返回獲取到的數(shù)據(jù) Log.i(TAG, "onSuccess: " + result); } @Override public void onFinished() { dia.dismiss();//加載完成 } @Override public void onCancelled(CancelledException cex) { } @Override public void onError(Throwable ex, boolean isOnCallback) { } }); }
我在項(xiàng)目中通過以上方法進(jìn)行圖片上傳,發(fā)現(xiàn)有點(diǎn)小問題,或許是我把這個方法使 用不到位。
在與服務(wù)器聯(lián)調(diào)時,同事總是告訴我沒有收到文件流數(shù)據(jù),結(jié)果肯定是上傳失敗。后來繼續(xù)看代碼跟進(jìn),發(fā)現(xiàn)通過
` params.addBodyParameter("file", new File(upUrl));`
這種方式傳遞文件數(shù)據(jù),默認(rèn)的請求數(shù)據(jù)類型并不是文件類型所需要的multipart/form-data類型數(shù)據(jù)。
通過看相應(yīng)源碼,我們在使用xUtils實(shí)現(xiàn)網(wǎng)絡(luò)請求時,通過
`RequestParams params = new RequestParams(Constants.ADD_ZONE_PLANE);`創(chuàng)建請求,然后通過
` params.setRequestBody(body);`傳遞請求參數(shù)。
其實(shí)setRequestBody(RequestBody requestBody)方法是調(diào)用RequestParams的父類BaseParams中的方法:
public void setRequestBody(RequestBody requestBody) { this.requestBody = requestBody; }
考慮是參數(shù)數(shù)據(jù)類型問題,我們就從傳遞參數(shù)RequestBody入手,發(fā)現(xiàn)在xUtils中,默認(rèn)有:
FileBody,InputStreamBody,MultipartBody及StringBody等幾種類型的請求Body,當(dāng)然這些都是RequestBody的子類 。
發(fā)現(xiàn)MultipartBody類型中,有這個方法:
private void generateContentType() { String boundaryPostfix = Double.toHexString(Math.random() * 0xFFFF); boundaryPostfixBytes = boundaryPostfix.getBytes(); contentType = "multipart/form-data; boundary=" + new String(BOUNDARY_PREFIX_BYTES) + boundaryPostfix; }
看到返回的類型是multipart/form-data...,正是我想要的,所以請求參數(shù)就從MultipartBody入手考慮上傳文件。
MultipartBody類的構(gòu)造方法如下:
//參數(shù)分別是要傳入的數(shù)據(jù),和數(shù)據(jù)編碼類型 public MultipartBody(List<KeyValue> multipartParams, String charset) { if (!TextUtils.isEmpty(charset)) { this.charset = charset; } this.multipartParams = multipartParams; generateContentType(); ... }
從構(gòu)造方法需要的參數(shù)開始,我們一步一步地實(shí)現(xiàn)MultipartBody所需要的數(shù)據(jù)。
//創(chuàng)建List<KeyValue>對象 List<KeyValue> list = new ArrayList<>(); //給list中添加數(shù)據(jù),filePah是上傳的文件路徑,比如sd卡中圖片 list.add(new KeyValue("file", new File(filePah)));//文件流數(shù)據(jù) //其它參數(shù),根據(jù)項(xiàng)目而定,比如我的項(xiàng)目中要傳入的參數(shù)是json格式的 list.add(new KeyValue("parameters", json.toString())); //創(chuàng)建MultipartBody MultipartBody body = new MultipartBody(list, "UTF-8"); //添加請求參數(shù) params.setRequestBody(body);
這樣就可以實(shí)現(xiàn)文件上傳,最后貼下整個請求方法的相關(guān)代碼:
//要傳遞給服務(wù)器的json格式參數(shù) JSONObject json = new JSONObject(); try { json.put("devId", id); json.put("devName", devName); json.put("keyWord", keyWord); } catch (JSONException e) { e.printStackTrace(); } //構(gòu)建RequestParams對象,傳入請求的服務(wù)器地址URL RequestParams params = new RequestParams(Constants.UPLOAD_FILE); params.setAsJsonContent(true); List<KeyValue> list = new ArrayList<>(); list.add(new KeyValue("file", new File(filePah))); list.add(new KeyValue("parameters", json.toString())); MultipartBody body = new MultipartBody(list, "UTF-8"); params.setRequestBody(body); x.http().post(params, new org.xutils.common.Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { LogUtil.e("請求結(jié)果:" + result); } @Override public void onFinished() { //上傳完成 } @Override public void onCancelled(CancelledException cex) { //取消上傳 } @Override public void onError(Throwable ex, boolean isOnCallback) { //上傳失敗 LogUtil.e("請求失敗:" + ex.toString()); } });
關(guān)于Android上傳功能的更多內(nèi)容請點(diǎn)擊專題:Android上傳操作匯總進(jìn)行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義View實(shí)現(xiàn)簡單文字描邊功能
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)簡單文字描邊功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android SharedPreferences數(shù)據(jù)存儲詳解
SharedPreferences是安卓平臺上一個輕量級的存儲類,用來保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時,將此activity的狀態(tài)保存到SharedPereferences中;當(dāng)Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時,再從SharedPreferences中將值取出2022-11-11Android 圓角邊框的實(shí)現(xiàn)方式匯總
這篇文章主要介紹了Android 圓角邊框的實(shí)現(xiàn)方式匯總的相關(guān)資料,需要的朋友可以參考下2016-03-03Android學(xué)習(xí)教程之圖片毛玻璃效果(4)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之圖片毛玻璃效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android實(shí)現(xiàn)無標(biāo)題欄全屏的方法
這篇文章主要介紹了Android實(shí)現(xiàn)無標(biāo)題欄全屏的三種方法,感興趣的小伙伴們可以參考一下2016-07-07Android Zxing生成二維碼經(jīng)典案例分享
這篇文章主要為大家分享了Android Zxing生成二維碼經(jīng)典案例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android GridView擴(kuò)展仿微信微博發(fā)圖動態(tài)添加刪除圖片功能
這篇文章主要為大家詳細(xì)介紹了Android GridView擴(kuò)展仿微信微博發(fā)圖動態(tài)添加刪除圖片功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05