Okhttp3上傳多張圖片同時傳遞參數


之前上傳圖片都是直接將圖片轉化為io流傳給服務器,沒有用框架傳圖片。

最近做項目,打算換個方法上傳圖片。

Android發展到現在,Okhttp顯得越來越重要,所以,這次我選擇用Okhttp上傳圖片。

Okhttp目前已經更新到Okhttp3版本了,用法跟之前相比,也有一些差別。在網上找了很多資料,

並和java后台同事反復調試,終於成功上傳多張圖片,同時傳遞一些鍵值對參數。

以下是我對該過程的封裝:

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

/**
     * 上傳多張圖片及參數
     * @param reqUrl URL地址
     * @param params 參數
     * @param pic_key 上傳圖片的關鍵字
     * @param paths  圖片路徑
     */
    public Observable<String> sendMultipart(String reqUrl,Map<String, String> params,String pic_key, List<File> files){
        return Observable.create(new Observable.OnSubscribe<String>(){

            @Override
            public void call(Subscriber<? super String> subscriber) {
                MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
                multipartBodyBuilder.setType(MultipartBody.FORM);
                //遍歷map中所有參數到builder
                if (params != null){
                    for (String key : params.keySet()) {
                        multipartBodyBuilder.addFormDataPart(key, params.get(key));
                    }
                }
                //遍歷paths中所有圖片絕對路徑到builder,並約定key如“upload”作為后台接受多張圖片的key
                if (files != null){
                    for (File file : files) {
                        multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
                    }
                }
                //構建請求體
                RequestBody requestBody = multipartBodyBuilder.build();

                Request.Builder RequestBuilder = new Request.Builder();
                RequestBuilder.url(reqUrl);// 添加URL地址
                RequestBuilder.post(requestBody);
                Request request = RequestBuilder.build();
                mOkHttpClient.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        subscriber.onError(e);
                        subscriber.onCompleted();
                        call.cancel();
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String str = response.body().string();
                        subscriber.onNext(str);
                        subscriber.onCompleted();
                        call.cancel();
                    }
                });
            }
        });
    }
View Code

在UI界面的調用:

OkHttp3Utils.getInstance().sendMultipart(Constants.URL.URL_ADD_NOTICE, mMap, "appendix", mImageList)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable throwable) {
                        LogUtil.i(TAG, "throwable:" + throwable.toString());
                    }

                    @Override
                    public void onNext(String s) {
                       
                        LogUtil.i(TAG, "s:" + s);
                    }
                });
View Code

調試過程中,有一次將

multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
寫成了
multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));
導致后台無法用常規方法獲取圖片(雖然斷點調試時也能看到圖片數據),這點需要注意。


最后:非常感謝同事的幫助!贈人玫瑰,手有余香~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM