下面以一個例子來講解在項目中如何使用OKHttp來對本地圖片做個最簡單的上傳功能,基本上無封裝,只需要簡單調用便可(對于OKHttp的引入不再單獨做介紹)。
1:構建上傳圖片附帶的參數(params)
Map<String, Object> reqData = new HashMap<>(); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
其中reqData中是需要傳入的參數,如接口請求token,時間戳,版本號等。然后構建RequestBody,表示上傳類型,這里以form表單形式提交,當然也可以以Json格式提交,只要和后臺約定好便可。然后構建filePart,有單個圖片文件和多個文件圖片選項,多個文件也是封裝在MultipartBody.Part中的,這里以單個文件為例。
2:第二步,把參數與圖片數據封裝到心情求體里。這里ReqData中便是傳遞需要的參數,這里對傳遞過來的參數重新取出以鍵值對方式構建。
MediaType MEDIA_TYPE_PNG = MediaType.parse("multipart/form-data"); MultipartBody multipartBody = new MultipartBody.Builder().setType(MEDIA_TYPE_PNG).addFormDataPart("token", reqData.get("token").toString()).addFormDataPart("ts", reqData.get("ts").toString()).addFormDataPart("rand", reqData.get("rand").toString()).addFormDataPart("platform", reqData.get("platform").toString()).addFormDataPart("version", reqData.get("version").toString()).addFormDataPart("source", "appimg").addPart(filePart).build();
3:發起請求,這里需要注意的有幾點:
(1)把上述構建的請求體傳到Request中,在OkHttpClient的配置中做簡單配置參數。如請求連接時間,讀寫時間等。
(2)在Request中設置上傳URL,就是需要上傳的接口詳細地址。
(3)在回調函數中接收返回的數據,注意,在回調函數中無論成功還是失敗都是默認在子線程中,當我們需要操作UI時需要切換到主線程中,避免發生應用Crash
Request.Builder requestBuild = new Request.Builder(); Request request = requestBuild.url(UPLOAD_PHOTO_URL).post(multipartBody).build(); OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build(); okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {//返回失敗的數據hideLoading();Log.e("onFailure img-->>", e.getMessage());}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {//返回成功的數據String newAvatar = response.body().string();Log.e("onResponse img-->>", newAvatar);hideLoading();imageUrl = newAvatar;locolPath = file.getAbsolutePath();//切換到主線程中去操作UIrunOnUiThread(new Runnable() {@Overridepublic void run() {//本地封裝的圖片加載工具類加載已上傳成功的圖片ImageUtil.loadLocalFile(XXActivity.this, iv_graph, file.getAbsolutePath());}});} });