Need help in POST multiple image file using retrofit?

早过忘川 提交于 2019-12-17 15:46:31

问题


How to add multiple images/files on a same parameter along with other textual data using retrofit?

Single image is uploading perfectly using following interface
    @Multipart
    @POST("/users/updateProfile/")
    public void updateProfileWithImage(
                    @Part("user_id") TypedString first_name,
                    @Part ("image") TypedFile image, 
                    Callback<WebResponse> callback);

回答1:


You can use the @MultiPart Post with @PartMap as parameter

Map<String, TypedFile> files = new HashMap<String, TypedFile>();
files.put("my file number one", new TypedFile("image/jpg", new File(filename)));
files.put("my file number two", new TypedFile("image/jpg", new File(filename)));

apiInterface.updateProfileWithImage("first name here", files);

private interface ApiInterface{
    @Multipart
    @POST("/users/updateProfile/")
    Response updateProfileWithImage(
     @Part("user_id") TypedString first_name,
     @PartMap Map<String,TypedFile> Files
    );

}



回答2:


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



来源:https://stackoverflow.com/questions/22658797/need-help-in-post-multiple-image-file-using-retrofit

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!