English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
以前の画像アップロードは、画像を直接ioストリームとしてサーバーに渡し、フレームワークを使用して画像を渡すことはありませんでした。
最近プロジェクトを進める中で、画像アップロードの方法を変更することを計画しました。
Androidは現在このように進化しており、Okhttpはますます重要になってきましたので、今回はOkhttpを使用して画像をアップロードすることにしました。
Okhttpは現在、Okhttpに更新されています3バージョンが変わりました。前回の使い方と比べて、いくつかの違いがあります。多くの資料をオンラインで探しました。
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に追加し、キーとして「upload」を使用して、バックエンドが複数の画像を受け入れるキーとして約束します 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(); } }); } }); }
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); } });
デバッグの過程で、multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));がmultipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));に書き換わってしまい、バックエンドでは通常の方法で画像を取得できません(ブレークポイントデバッグでは画像データが見えるので、この点に注意してください)。
これで本文のすべてが終わりです。皆さんの学習に役立つことを願っています。また、呐喊ガイドを多くのサポートをお願いします。
声明:本文の内容はインターネットから提供され、著作権者は所有者です。インターネットユーザーが自発的に貢献し、自己でアップロードした内容であり、本サイトは所有権を持ちません。また、人工編集は行われていません。著作権に関する問題があれば、notice#wまでメールを送ってください。3codebox.com(メール送信時は、#を@に変更してください)で通報し、関連する証拠を提供してください。一旦確認がついたら、本サイトは即座に侵害を疑われる内容を削除します。