2017-02-02 6 views
0

Я использую Okhttp lib для отправки данных на сервер. Я хочу установить текст и изображения в RequestBody. Для загрузки нескольких изображений на сервер с использованием Okhttp i следуйте this link. Я реализовал этот тип кода в своем приложении в другом классе активности и отлично работает. У меня есть checked этот вопрос, как передать массив в RequestBody.Передача текста и нескольких изображений в виде массива с использованием okhttp

Мой формат Список_массивов подобен этому

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_order и block0 и image0[] будут содержать первые изображения блоков в виде массива и аналогичные для других.

API работает нормально, потому что, когда я тестирую пост почтальона, я получаю данные на стороне сервера. Вы можете видеть ниже. enter image description here.

Вот моя функция java, которая устанавливает данные в RequestBody и делает вызов для отправки этих данных на сервере.

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+"]"; 

, когда я проходил простые изображения как массив в Okhttp тогда я сделать код, как описано выше. Для загрузки нескольких изображений на сервере с помощью Okhttp, я также следую this link по мере того, как вы будете следовать.

+0

Это произведение очарование. Огромное спасибо. Вы экономите свое время. @Ниндзя. – Shailesh

 Смежные вопросы

  • Нет связанных вопросов^_^