Android : upload Image and JSON using MultiPartEntityBuilder
Asked Answered
H

3

12

I try to upload data to server, my data containing multiple images and large JSON, before it, I Try to send with convert image to string using base64 and send my another data and image that I've convert before with JSON, but I face Problem OutOfMemory here, so I read one of solutions that said I must to try using MultipartEntityBuilder. I still confusing and not understand how to do it with MultiPartEntityBuilder, Is there anyone can help me the way to do it with MultiPartEntityBuilder? this is my code :

    try{
    //membuat HttpClient
    //membuat HttpPost
    HttpPost httpPost= new HttpPost(url);
    SONObject jsonObjectDP= new JSONObject();
    System.out.println("file audio "+me.getModelDokumenPendukung().getAudio());
    jsonObjectDP.put("audio_dp",MethodEncode.EncodeAudio(me.getModelDokumenPendukung().getAudio()));
    jsonObjectDP.put("judul_audio",me.getModelDokumenPendukung().getJudul_audio());
    jsonObjectDP.put("ket_audio",me.getModelDokumenPendukung().getKet_audio());
    JSONArray ArrayFoto= new JSONArray();

    //This loop For my multiple File  Images
    List<ModelFoto>ListFoto=me.getModelDokumenPendukung().getListFoto();
    for (int i=0; i<ListFoto.size();i++) {
        JSONObject jsonObject= new JSONObject();
        jsonObject.put("foto", ListFoto.get(i).getFile_foto());
        jsonObject.put("judul_foto", ListFoto.get(i).getJudul_foto());
        jsonObject.put("ket_foto", ListFoto.get(i).getKet_foto());
        ArrayFoto.put(jsonObject);

    }

    JSONObject JSONESPAJ=null;
     JSONESPAJ = new JSONObject();
     JSONObject JSONFINAL = new JSONObject();
            JSONESPAJ.put("NO_PROPOSAL",me.getModelID().getProposal());
            JSONESPAJ.put("GADGET_SPAJ_KEY",me.getModelID().getIDSPAJ());
            JSONESPAJ.put("NO_VA",me.getModelID().getVa_number());
            JSONESPAJ.put("Dokumen_Pendukung",jsonObjectDP);

            JSONFINAL.put("ESPAJ", JSONESPAJ);
            JSONFINAL.put("CLIENT", "ANDROID");
            JSONFINAL.put("APP", "ESPAJ");

            MultipartEntityBuilder multiPartEntityBuilder= MultipartEntityBuilder.create();
    multiPartEntityBuilder.addPart("ESPAJ",JSONFINAL.toString());

    httpPost.setEntity(multiPartEntityBuilder.build());

    HttpResponse httpResponse = httpclient.execute(httpPost);


    inputStream = httpResponse.getEntity().getContent();
        if(inputStream != null)
        result = convertInputStreamToString(inputStream);
    else
        result = "Did not work!";
}catch(OutOfMemoryError e){
      Log.e("MEMORY EXCEPTION: ", e.toString());
} catch(ConnectTimeoutException e){
    Log.e("Timeout Exception: ", e.toString());
} catch(SocketTimeoutException ste){    
    Log.e("Timeout Exception: ", ste.toString());
} catch (Exception e) {
//    Log.d("InputStream", e.getLocalizedMessage());
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException{
    BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
    String line = "";
    String result = "";
    while((line = bufferedReader.readLine()) != null)
//      hasil=line;
        result += line;

    inputStream.close();
    return result;

}   

is there anyone can help me to teach and tell me how to send JSON and Image using MultiPartEntityBuilder?

Harelip answered 16/6, 2014 at 8:58 Comment(0)
M
26

To send binary data you need to use addBinaryBody method of MultipartEntityBuilder. Sample of attaching:

import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
//Image attaching
MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
File file;
multipartEntity.addBinaryBody("someName", file, ContentType.create("image/jpeg"), file.getName());
//Json string attaching
String json;
multipartEntity.addPart("someName", new StringBody(json, ContentType.TEXT_PLAIN));

Then make request as usual:

HttpPut put = new HttpPut("url");
put.setEntity(multipartEntity.build());
HttpResponse response = client.execute(put);
int statusCode = response.getStatusLine().getStatusCode();
Mollusc answered 16/6, 2014 at 9:25 Comment(7)
so for JSON how to send it?Harelip
@NenMa json is just a string. So send it as usual plain text. I've updated answer.Mollusc
so you mean I must to convert my JSON as String first, right?Harelip
anb btw why I can't import org.apache.http.entity.ContentType; T.T ?Harelip
@NenMa yes, you need to convert to String your json. ContentType is a part of httpcore-4.3.2.jar. You can download it here: hc.apache.org/downloads.cgiMollusc
+1 for your help, I can't accept your answer because I still waiting for another answer and btw I make request with HttpPost not httpPut, is it okay?Harelip
@NenMa Yeah, it's ok. Actually it depends on your server. If it accepts files on POST request then send it using POST method.Mollusc
C
1

There is my solution, for sending images and text fields (with apache http libraries) with POST request. Json could be added in the same way, as my fields group and owner.

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
            byte[] imageBytes = baos.toByteArray();

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP);

            String boundary = "-------------" + System.currentTimeMillis();

            httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary);

            ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png");
            StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN);
            StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN);

            HttpEntity entity = MultipartEntityBuilder.create()
                    .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
                    .setBoundary(boundary)
                    .addPart("group", sbGroup)
                    .addPart("owner", sbOwner)
                    .addPart("image", bab)
                    .build();

            httpPost.setEntity(entity);

            try {
                HttpResponse response = httpclient.execute(httpPost);
                ...then reading response
Cyrilla answered 14/8, 2014 at 12:31 Comment(0)
B
0
    Log.d(LOG_SERVICE_TAG, "Sending Multipart Image with Json data"+");      
    InputStream imageStream;
    JSONObject objResult;
    boolean bSucess = true;
            // Base 64 image string was stored with image object , 
    String imageBase64 = image.getImageString();
    // This base64 to byte , One can directly read bytes from file from Disk
    String imageDataBytes = imageBase64.substring( imageBase64.indexOf(",")+1);
    HttpClient client = null;
    HttpPost post = null;
    HttpResponse response = null;
    HttpEntity httpEntity = null;
    String result;
    imageStream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT));   
    try{
        //Forming Json Object 
        JSONObject jsonImageMetdata = new JSONObject();     
        JSONObject objMultipart = new JSONObject();     
        try {
            objMultipart.put("param1", "param 1 value");
            objMultipart.put("param2",  "param 2 value"  );
            objMultipart.put("param3","param 3 value" );
            objMultipart.put("param4", "param 4 value");                
            jsonImageMetdata.put("MultipartImageMetadata", objMultipart);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // converting json data to string
        String strImageMetadata = jsonImageMetdata.toString();
        client = new DefaultHttpClient();
        post = new HttpPost("https://abcd");
        MultipartEntityBuilder entityBuilder = null;
        try{
            entityBuilder = MultipartEntityBuilder.create();
        }
        catch(Exception a){
            Log.d("name",a.getMessage());
            throw a;                
        }
        entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);    

        // adding text
        entityBuilder.addTextBody("dummyParameter","Dummy text",ContentType.TEXT_PLAIN);             

        // adding Image
        if(imageStream != null){                
            entityBuilder.addBinaryBody("file", imageStream,ContentType.create("image/jpeg"),"imagename.jpg");
        }         

        // sending formed json data in form of text
        entityBuilder.addTextBody("descriptions", strImageMetadata, ContentType.APPLICATION_JSON) ;
        HttpEntity entity = entityBuilder.build();
        post.setEntity(entity);         
        response = client.execute(post);
        httpEntity = response.getEntity();
        result = EntityUtils.toString(httpEntity);

Download httpcore-4.3.2.jar , httpmime-4.3.3.jar from Apache and add them in lib folder of Android project for using MultipartEntityBuilder

Brinkema answered 17/6, 2014 at 6:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.