Need help in POST multiple image file using retrofit?

前端 未结 2 1723
-上瘾入骨i
-上瘾入骨i 2020-12-05 08:33

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

Single image is uploading perfectly using following interf         


        
相关标签:
2条回答
  • 2020-12-05 09:03

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

    0 讨论(0)
  • 2020-12-05 09:07

    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
        );
    
    }
    
    0 讨论(0)
提交回复
热议问题