English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android中Okhttp3实现上传多张图片同时传递参数

Avant, pour téléverser des images, elles étaient directement converties en flux IO et transmises au serveur, sans utiliser de cadre pour transmettre des images.

Récemment, en travaillant sur un projet, j'ai l'intention de changer de méthode pour téléverser des images.

Android a évolué jusqu'à aujourd'hui, Okhttp est de plus en plus important, donc, cette fois, j'ai choisi d'utiliser Okhttp pour téléverser des images.

Okhttp a été mis à jour à Okhttp3Version, les différences par rapport à la version précédente sont également présentes. J'ai cherché beaucoup de documents en ligne,

Et après de multiples tests avec les collègues en arrière-plan Java, nous avons finalement réussi à téléverser plusieurs images tout en transmettant des paires clé-valeur.

Voici l'encapsulation de ce processus :

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
/**
   * Téléverser plusieurs images et paramètres
   * @param reqUrl Adresse URL
   * @param params Paramètres
   * @param pic_key Mot clé pour le téléversement de l'image
   * @param paths Chemin de l'image
   */
  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);
        //Parcourir tous les paramètres de la map vers le builder
        if (params != null){
          for (String key : params.keySet()) {
            multipartBodyBuilder.addFormDataPart(key, params.get(key));
          }
        }
        //Parcourir tous les chemins d'accès绝对chemins des images dans le builder, et convenir d'une clé comme "upload" en tant que clé acceptée par le serveur pour plusieurs images
        if (files != null){
          for (File file : files) {
            multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
          }
        }
        //Construire le corps de la requête
        RequestBody requestBody = multipartBodyBuilder.build();
        Request.Builder RequestBuilder = new Request.Builder();
        RequestBuilder.url(reqUrl);// Ajouter l'adresse 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();
          }
        });
      }
    });
  } 

Appel dans l'interface utilisateur :

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);
          }
        }); 

Pendant le processus de débogage, une fois, j'ai écrit multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); au lieu de multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file)); ce qui a causé le serveur à ne pas pouvoir obtenir l'image de manière conventionnelle (même si les données d'image peuvent être vues lors du débogage par point d'arrêt), cela doit être noté.

Voici la totalité du contenu de cet article, j'espère qu'il vous sera utile dans vos études, et j'espère que vous soutiendrez également le tutoriel d'entraînement.

Déclaration : le contenu de cet article est tiré d'Internet, propriété intellectuelle de ses auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet, ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, ni assume la responsabilité des responsabilités juridiques pertinentes. Si vous trouvez du contenu suspect de violation de droits d'auteur, vous êtes invités à envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois confirmée, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)