Upload multipart image data in JSON with Retrofit?
Asked Answered
G

3

9

I would like to do a PUT request with this JSON body (containing a picture) and with Retrofit. I'm using it under Android:

{
    "Request": {
        "data": {
            "Key": "keydata",
            "param": {
                "title": "Testingpostmultipartimageupload",
                "photo": **"IMAGE BYTE DATA"**
            }
        }
    }
}

Any clues?

Gathard answered 11/6, 2014 at 14:30 Comment(3)
I am having an issue while doing this in retrofit 2. Can i know how to do this in retrofit 2.Presswork
I was using retrofit 1.6. I'll check tonight for retrofit 2.Gathard
thank you @Patrick. it will be helpful to me.Presswork
G
17

Ok, I found a solution using multipart, somethings like that:

@Multipart
@PUT("/users/{id}")
void modifyPic(
    @Header("auth_token") String token,
    @Path("id") int userid,
    @Part("request[data][param][title]") String title,
    @Part("request[data][param][Photo]") TypedFile avatar,
    Callback<User> cb
);
Gathard answered 24/6, 2014 at 12:50 Comment(6)
How do you fill the others fields of your object? (title for example)Chop
you just have to add @Part("request[data][param][title]") String title. I'll edit my answer to set complete answer.Gathard
Thank you for that! Does it have to be a @Part annotation for others fields than the file's one?Chop
Yes, this solution needs to use @Part for each fields.Gathard
@Gathard Can you point me to a solution for my attempt to send an image with JSON data in one request?Earlearla
@Earlearla It looks like you found a solution?Gathard
C
0

You need to put image data in byte by using multipart form data.

try {
    HttpPost httppost = new HttpPost("some url");
    MultipartEntity multipartEntity = 
        new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
    multipartEntity.addPart("Image", new FileBody(image));
    httppost.setEntity(multipartEntity);
    mHttpClient.execute(httppost, new YOURHANDLER());
} catch (Exception e) {
    Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e);
}

To send post request using parameters

HttpPost httpPost = new HttpPost(url);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

if (values != null) {
    for (Map.Entry<String, String> entry : values.entrySet()) {
        nameValuePairs.add(
            new BasicNameValuePair(entry.getKey(), entry.getValue()));
    }
    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
}
Chryso answered 11/6, 2014 at 14:39 Comment(3)
Thanks. How do you add to whole json object? By the way, i'm trying to do this using Retrofit lib.Gathard
you cannot send json object until and unless you server accepting json string and parsing it into object. Usually post requests are send with key value pairs. see my updated answerChryso
@MurtazaHussain I need your help I have JSON string and I need to add selected PHOTO to upload it with it can. can I get you mail ?Cumber
P
0

Retrofit only takes multipart and requestbody for its multipart.

Call<SubmitLevel1Part2IconResp> loadLevel1halfIconswithImage(@Part("headerdata[relation][icon_type]") RequestBody icon_type, @Part("headerdata[relation][name]") RequestBody name, @Part MultipartBody.Part file);

And then in java

 // MultipartBody.Part is used to send also the actual filename
 MultipartBody.Part body =  MultipartBody.Part.createFormData("headerdata[relation][relative_image]", fileUpload.getName(), requestFile);



call = service.loadLevel1halfIconswithImage(icon_type, name, body);
Photomontage answered 19/6, 2017 at 2:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.