2017-02-02 39 views
0

Okhttp libを使用してサーバーにデータを送信しています。テキストと画像をRequestBodyに設定したいと思います。 Okhttpを使って複数の画像をサーバーにアップロードする場合は、this linkに従ってください。私は別のアクティビティクラスとその仕事の良いアプリでこの種のコードを実装しました。私はcheckedRequestBodyに配列を渡す方法この質問があります。okhttpを使用してテキストと複数の画像を配列として渡す

マイArrayListの形式は、この

blockList 
{ 
    block0 
    { 
     description0 = First block 
     image0 = {image1, image2} 
     video0 = videolink 
     disp_order0 = 0 
     block0 = 0 
    } 
    block1 
    { 
     description1 = second block 
     image1 = {image1,image2,image2} 
     video1 = videolink 
     disp_order1 = 1 
     block1 = 1 
    } 
    ..... 
} 

私の要件のようなものです: -

今私は、単一のパラメータに配列として複数の画像を送りたいです。最初のブロックを送信すると、パラメータ名はdescription0,image0[],video1,disp_orderblock0image0[]であり、最初のブロック画像は配列として、その他は同じものになります。

APIは正常に動作しています。なぜなら、私が郵便配達でテストすると、サーバー側でデータが受信されるからです。あなたは以下で見ることができます。 enter image description here

ここは、RequestBodyのデータを設定し、そのデータをサーバーに送信するための呼び出しを行うJavaの関数です。

ProgressDialog pd; 
private OkHttpClient client; 

private void saveCastBoxOnServer(String castBoxTitle, String selectedCastBoxId, String selectedCategoryId, 
            String userId, String action, ArrayList<CastBoxBlock> blockList) 
{ 
    try 
    { 
     client = new OkHttpClient.Builder() 
        .retryOnConnectionFailure(true) 
        .build(); 

     ArrayList<CastBoxBlock> blockArrayList = blockList; 
     int blockSize = blockArrayList.size(); 

     MultipartBody.Builder multipartBuilderNew = new MultipartBody.Builder().setType(MultipartBody.FORM); 

     for (int i = 0; i < blockSize; i++) 
     { 

      String description = blockArrayList.get(i).getBlockDescription(); 
      String descriptionField = "description"+i; 

      multipartBuilderNew.addFormDataPart(descriptionField, description); 

      /**This is used for distribution of images and videos. After that set that 
      * Images and video in multipartBuilder. 
      **/ 
      CastBoxBlock model = blockArrayList.get(i); 

      ArrayList<SelectedMediaModel> mediaModels = model.getSelectedMediaModelArrayList(); 
      int mediaModelsSize = mediaModels.size(); 

      String passingVideoUri = ""; 
      String videoUri = ""; 
      for (int j = 0; j < mediaModelsSize; j++) 
      { 
       String mediaType = mediaModels.get(j).getMediaType(); 


       if (mediaType.equals(StringKeyConstant.mediaVideo)) 
       { 
        videoUri = mediaModels.get(j).getMediaPath(); 

        if (passingVideoUri.trim().length()==0){ 
         passingVideoUri = videoUri; 
        }else{ 
         passingVideoUri = passingVideoUri + "," + videoUri; 
        } 
       } 
       else if (mediaType.equals(StringKeyConstant.mediaImage)) 
       { 
        String imagePath = mediaModels.get(j).getMediaPath(); 
        File sourceFile = new File(imagePath); 

        /**Changes whether JPEG or PNG**/ 
        final MediaType MEDIA_TYPE = MediaType.parse(
        constant.getFileExt(imagePath).endsWith("png") ? "image/png" : "image/jpeg"); 

        String imageName = System.currentTimeMillis() + j + "_block_img.jpg"; 
        String imageField = "image"+i+"["+j+"]"; 

        multipartBuilderNew.addFormDataPart(imageField,imageName, 
         RequestBody.create(MEDIA_TYPE, sourceFile)); 
       } 
      } 

      /**This is used to set the {@videoUri} block of videos and send to sever**/ 
      String videoField = "video"+i; 
      multipartBuilderNew.addFormDataPart(videoField, passingVideoUri); 

      /**This will set the {@display_order} in multipartBuilder**/ 
      String displayOrderField = "disp_order"+i; 
      String displayOrder = blockArrayList.get(i).getBlockIndex(); 
      multipartBuilderNew.addFormDataPart(displayOrderField, displayOrder); 

      /**This will set the {@block} value in multipartBuilder**/ 
      String blockField = "block"+i; 
      String block = ""+i; 
      multipartBuilderNew.addFormDataPart(blockField, block); 
     } 

     pd = new ProgressDialog(activity); 
     pd.setCancelable(false); 
     pd.setMessage(getResources().getString(R.string.please_wait)); 
     pd.show(); 

     RequestBody formBody = multipartBuilderNew 
      .addFormDataPart("cast_title", castBoxTitle) 
      .addFormDataPart("user_id", userId) 
      .addFormDataPart("cast_box", selectedCastBoxId) 
      .addFormDataPart("category", selectedCategoryId) 
      .addFormDataPart("action", action) 
      .build(); 


     Request request = new Request.Builder() 
      .url(ApiUtils.ADD_FETCH_USER_CAST) 
      .post(formBody) 
      .build(); 

     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       Log.e(TAG, "Get Api credential fail."+call.toString()); 
       e.printStackTrace(); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException 
      { 
       try 
       { 
        if (pd != null){ 
         pd.cancel(); 
         pd.dismiss(); 
         pd = null; 
        } 
        String castSavedResponse = response.body().string(); 
        Log.i(TAG, "castSavedResponse = " + castSavedResponse); 
       } 
       catch (Exception e){ 
        Log.e(TAG, "***Error : onResponse() method"); 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
    catch (Exception e){ 
     Log.e(TAG, "***Error : saveCastBoxOnServer()"); 
     e.printStackTrace(); 
    } 
} 

ありがとうございます。もし誰かが助けてくれれば、それは非常に感謝するでしょう。

答えて

0

あなたのコードをチェックすると、私はひとつ注意します。私は確信していますが、私はimage[]の場所にあなたのコードを変更すると思います。以下のようにコードを変更することができます。私はこれがあなたを助け、あなたが解決策を得たことを願っています。

使用このコード

String imageField = "image"+i+"[]"; 

代わりの

String imageField = "image"+i+"["+j+"]"; 

iはOkhttpでアレイのような単純な画像を渡されたときに、私は、上記のコードを実行します。 Okhttpを使用してサーバー上に複数の画像をアップロードする場合は、私もあなたが従うとthis linkに従ってください。

+0

それは仕事の魅力です。どうもありがとうございます。あなたは私の時間を節約します。 @忍者。 – Shailesh

関連する問題