Vikas Sharma
Vikas Sharma

Reputation: 107

upload array of images in multipart retrofit2

I need to upload an array of images on server using multi-part.and I Also want to give key to that array, otherwise server don't recognize the array. I have tried the solutions below, but these do not work: Solution1 :

 MultipartBody.Part[] array = new MultipartBody.Part[items.size()];
            for(int i=0;i<items.size();i++){
                File file = new File(items.get(i));
                RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
                MultipartBody.Part filePart = MultipartBody.Part.createFormData("value_"
                                + String.valueOf(uploadMissionRequestModel.getStepId()), file.getName(),
                        requestBody);
                array[i]=filePart;
            }

RequestBody apiKey = RequestBody.create(MediaType.parse("text/plain"),
                uploadMissionRequestModel.getApiKey());
        RequestBody stepId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getStepId()));
        RequestBody missionId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getMissionId()));
        RequestBody overWrite = RequestBody.create(MediaType.parse("text/plain"),
                "yes");

        Map<String, RequestBody> partMap = new HashMap<>();
        partMap.put("api_token", apiKey);
        partMap.put("MissionID", missionId);
        partMap.put("overwrite", overWrite);
        partMap.put("StepID", stepId);

 ApiServices service = RestClient.getClient();
        final Call<UploadMissionResponse> call = service.uploadFiles(partMap, array);

Solution2

RequestBody[] image_id = new RequestBody[items.size()];
        for(int i=0;i<items.size();i++){
            File file = new File(items.get(i));
            RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
            image_id[i]=requestBody;

        }
RequestBody apiKey = RequestBody.create(MediaType.parse("text/plain"),
                uploadMissionRequestModel.getApiKey());
        RequestBody stepId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getStepId()));
        RequestBody missionId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getMissionId()));
        RequestBody overWrite = RequestBody.create(MediaType.parse("text/plain"),
                "yes");

        Map<String, RequestBody> partMap = new HashMap<>();
        partMap.put("api_token", apiKey);
        partMap.put("MissionID", missionId);
        partMap.put("overwrite", overWrite);
        partMap.put("StepID", stepId);

        Map<String, RequestBody[]> imageMap = new HashMap<>();
        imageMap.put("value_8",image_id);

ApiServices service = RestClient.getClient();
        final Call<UploadMissionResponse> call = service.uploadFiles(partMap, imageMap);

Please suggest, How I can pass array of images with key name using retrofit2.

Upvotes: 3

Views: 4760

Answers (2)

Konstantin Berkov
Konstantin Berkov

Reputation: 1212

My request method:

@Multipart
@POST("admin/assets/upload/")
Observable<UploadResponse> uploadFiles(@Part MultipartBody.Part... files);

Creating parts from array of uri's. All parts will have key 'files[]', the one my backend recognizes:

//UriHandle and OkioUtil are my own classes to handle both 'content' and 'file' uris
//files has type of Uri[]
final MultipartBody.Part[] parts = new MultipartBody.Part[files.length];
for (int i = 0; i < files.length; i++) { 
    final UriHandle handle = UriUtil.getUriHandle(context, files[i]);
    final RequestBody body = OkioUtil.create(handle, mediaType);
    parts[i] = MultipartBody.Part.createFormData("files[]", handle.name(), body);
}

Sending request:

api.uploadFiles(part)
    .subscribeOn(...)
    .observeOn(...)
    .subscribe(result -> ...);

Upvotes: 4

Pouya Danesh
Pouya Danesh

Reputation: 1627

if I were you I would convert images to Base64 and send List<String> for images using your second solution.

Upvotes: 0

Related Questions