Retrofit 2.0 + OkHttp 3
Interface declaration:
@POST("postpath")
Call<Void> upload(@Body MultipartBody filePart);
Creating MultiPartBody
:
MultipartBody.Builder requestBodyBuilder = new MultipartBody.Builder()
.setType(MultipartBody.FORM);
then for each file(you can also add custom fields)
requestBodyBuilder.addFormDataPart("extraImage[]", "photo.jpg",
RequestBody.create(MediaType.parse("image/jpeg"), byteArrayOrFile));
and finally
api.upload(requestBodyBuilder.build());
P.S. you can add custom form fields (for example client.name
) to the same form with
requestBodyBuilder.addFormDataPart("client[name]", null, RequestBody.create(MediaType.parse("text/plain"), name))
or
requestBodyBuilder.addFormDataPart("client[name]", name))
Retrofit 1.9:
You can use MultipartTypedOutput to post variable number of multi-part parameters.
In addition to François' answer, to post multiple images with the same / repeating field name(as an array) in retrofit you can use MultipartTypedOutput
Method signature:
@POST("/postpath")
SomeResponse upload(@Body MultipartTypedOutput output);
Usage:
MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
multipartTypedOutput.addPart("mainImage", new TypedFile("image/jpeg", mainImage));
multipartTypedOutput.addPart("extraImage[]", new TypedFile("image/jpeg", file1));
multipartTypedOutput.addPart("extraImage[]", new TypedFile("image/jpeg", file2));
upload(multipartTypedOutput);
Square brackets
Please note that some server side frameworks(Rails) typically require square brackets(i.e. extraImage[]
instead of extraImage
), others don't (Spring MVC).