Android: upload de imagem e JSON usando MultiPartEntityBuilder

? Menma @ | Original: StackOverFlow
---

Eu tento fazer upload de dados para o servidor, os meus dados contendo várias imagens e grande JSON, antes dele, tento enviar imagem converso com a string usando base64 e enviar os meus mais dados e imagem que eu converso antes com JSON, mas eu enfrento problemaOutOfMemory aqui, então eu ler uma das soluções que disse que eu deveria tentar usar MultipartEntityBuilder . Eu ainda confuso e não entende como fazê-lo com MultiPartEntityBuilder Existe alguém pode me ajudar a maneira de fazê -lo com MultiPartEntityBuilder ? este é o meu código:

    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;

}   

existe alguém pode me ajudar a ensinar e me diga como enviar JSON e Imagem usando MultiPartEntityBuilder ?

---

Top 5 Responder

1Fox in socks @

Para enviar dados binários você precisa usar addBinaryBody método de MultipartEntityBuilder . Amostra de anexar :

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

Em seguida, fazer pedido, como de costume :

HttpPut put = new HttpPut("url");
put.setEntity(multipartEntity.build());
HttpResponse response = client.execute(put);
int statusCode = response.getStatusLine().getStatusCode();
2user2502741 @
    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);

Baixe httpcore - 4.3.2.jar, httpmime - 4.3.3.jar do Apache e adicioná-los na pasta lib do projeto Android para usar MultipartEntityBuilder

3Krystian @

Não é a minha solução, para o envio de imagens e campos de texto ( com bibliotecas Apache HTTP ), com pedido POST. Json poderia ser adicionado da mesma forma, como o meu grupo campos e proprietário .

            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