AiVision
AiVision

Reputation: 4233

Passing text and multiple images as an array using okhttp

I am using Okhttp lib to send data to server. I want to set text and images in RequestBody. For uploading multiple image to server using Okhttp i follow this link. I have implemented that type of code in my app in another activity class and its work fine. I have checked this question that how to pass array in RequestBody.

My arrayList format is like this

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
    }
    .....
}

My Requirement :-

Now i want to send multiple images as an array in single parameter. When i send first block then parameter names are description0,image0[],video1,disp_order and block0 and image0[] will contain first block images as array and same for other.

API is working fine because when i test in postman then i receive the data in server side. You can see in below.enter image description here.

Here is my java function that set the data in RequestBody and make a call to send that data on sever.

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

Thanks in advance. If any one will help it would be very appreciate.

Upvotes: 0

Views: 1409

Answers (1)

Ninja
Ninja

Reputation: 698

When i check your code then i note one things. I am no sure but i think you change your code on image[] place. you can just change your code as below. I hope this will help you and you got the solution.

Use this code

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

Instead of

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

when i passed simple images as an array in Okhttp then i do code as above. For uploading multiple images on server using Okhttp, i also follow this link as you follow.

Upvotes: 1

Related Questions