Search code examples
androidkotlinretrofit2

How to upload multipart form data and image in API using retrofit in android?


I'm upload file with other details in retrofit but in success response i got status 0 because of file is sent in bytearray.

Below is my code:

MyAPI class : interface and retrofit instance

@Multipart
@POST("edit_userinfo")
@Headers(## Heading ##
    "Content-Type: multipart/form-data",
    "Accept: */*"
)
fun editProfile(
    @Part("languges") lang: RequestBody,
    @Part("user_id") userId: RequestBody,
    @Part("name") name: RequestBody,
    @Part("gender") gender: RequestBody,
    @Part("keyword") keyword: RequestBody,
    @Part("mobile") mobile: RequestBody,
    @Part image: MultipartBody.Part
): Call<UploadResponse>


return Retrofit.Builder()
            .baseUrl("http://phpstack-916737-3182297.cloudwaysapps.com/")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(MyAPI::class.java)

MainActivity : api calling

    var lang = "English".toRequestBody("text/plain".toMediaTypeOrNull())
    var userId = Reques`your text`tBody.create("text/plain".toMediaTypeOrNull(), "1")
    var name = RequestBody.create("text/plain".toMediaTypeOrNull(), "Test12")
    var gender = RequestBody.create("text/plain".toMediaTypeOrNull(), "male")
    var mobno = RequestBody.create("text/plain".toMediaTypeOrNull(), "1212121212")
    var keyword = RequestBody.create("text/plain".toMediaTypeOrNull(),"**********")
    var image = MultipartBody.Part.createFormData(
        "photo",
        file.name,
        RequestBody.create("image/*".toMediaTypeOrNull(), file)
    )
    var apiCall = MyAPI().editProfile(
        lang, userId, name, gender, keyword, mobno,image
    )
    apiCall.enqueue(object : Callback<UploadResponse> {
        override fun onFailure(call: Call<UploadResponse>, t: Throwable) {
            Log.e("TAG", "onFailure: $t")
            t.printStackTrace()
            layout_root.snackbar(t.message!!)
        }

        override fun onResponse(
            call: Call<UploadResponse>,
            response: Response<UploadResponse>
        ) {
            response.body()?.let {
                Log.e("TAG", "onResponse: sucess $it")
                layout_root.snackbar("Status -> $it")
            }
        }
    })

this api is working in postman. photo : file(filetype) enter image description here

So how can i pass file in retrofit api.

Thanks in advance


Solution

  • Pass body in retrofit service like this:

    @POST("/edit_userinfo")
    @Headers("Accept: application/json")
    fun editUserInfo2(@Body body: RequestBody): Call<EditUserInfoResp>
    

    Call api service and pass requestbody as below:

    val requestBody: RequestBody = MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("userId", "your_user_id")
            .addFormDataPart("name", "name")
            .addFormDataPart(
                "photo",
                photoFile.name,
                RequestBody.create("image/*".toMediaTypeOrNull(), photoFile)
            )
            .build()
        var apiCall = retrofitServices.editUserInfo(requestBody)
    

    I hope this will work