Android使用xUtils3.0實現檔案上傳_Android

來源:互聯網
上載者:User

幾個月前寫過一篇部落格《xUtils3.0架構學習筆記》 ,上面也有記錄通過xUtils實現檔案上傳的使用方法,代碼如下:

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) {        //載入成功回調,返回擷取到的資料        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) {      }    });  }

我在項目中通過以上方法進行圖片上傳,發現有點小問題,或許是我把這個方法使 用不到位。
在與伺服器聯調時,同事總是告訴我沒有收到檔案流資料,結果肯定是上傳失敗。後來繼續看代碼跟進,發現通過
` params.addBodyParameter("file", new File(upUrl));`
這種方式傳遞檔案資料,預設的請求資料類型並不是檔案類型所需要的multipart/form-data類型資料。
通過看相應源碼,我們在使用xUtils實現網路請求時,通過
`RequestParams params = new RequestParams(Constants.ADD_ZONE_PLANE);`建立請求,然後通過
` params.setRequestBody(body);`傳遞請求參數。
其實setRequestBody(RequestBody requestBody)方法是調用RequestParams的父類BaseParams中的方法:

 public void setRequestBody(RequestBody requestBody) {    this.requestBody = requestBody;  } 

考慮是參數資料類型問題,我們就從傳遞參數RequestBody入手,發現在xUtils中,預設有:
 FileBody,InputStreamBody,MultipartBody及StringBody等幾種類型的請求Body,當然這些都是RequestBody的子類 。
 發現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...,正是我想要的,所以請求參數就從MultipartBody入手考慮上傳檔案。
MultipartBody類的構造方法如下:

//參數分別是要傳入的資料,和資料編碼類別型 public MultipartBody(List<KeyValue> multipartParams, String charset) {    if (!TextUtils.isEmpty(charset)) {      this.charset = charset;    }    this.multipartParams = multipartParams;    generateContentType();    ...  }

從構造方法需要的參數開始,我們一步一步地實現MultipartBody所需要的資料。

    //建立List<KeyValue>對象    List<KeyValue> list = new ArrayList<>();    //給list中添加資料,filePah是上傳的檔案路徑,比如sd卡中圖片    list.add(new KeyValue("file", new File(filePah)));//檔案流資料    //其它參數,根據項目而定,比如我的項目中要傳入的參數是json格式的    list.add(new KeyValue("parameters", json.toString()));    //建立MultipartBody     MultipartBody body = new MultipartBody(list, "UTF-8");     //添加請求參數    params.setRequestBody(body); 

這樣就可以實現檔案上傳,最後貼下整個要求方法的相關代碼:

//要傳遞給伺服器的json格式參數JSONObject json = new JSONObject();    try {      json.put("devId", id);      json.put("devName", devName);      json.put("keyWord", keyWord);    } catch (JSONException e) {      e.printStackTrace();    }    //構建RequestParams對象,傳入請求的伺服器位址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("請求結果:" + result);      }      @Override      public void onFinished() {        //上傳完成      }      @Override      public void onCancelled(CancelledException cex) {      //取消上傳      }      @Override      public void onError(Throwable ex, boolean isOnCallback) {      //上傳失敗        LogUtil.e("請求失敗:" + ex.toString());      }    });

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.