Android: загружать изображение и JSON с помощью MultiPartEntityBuilder

Я пытаюсь загрузить данные на сервер, мои данные, содержащие несколько изображений и большой JSON , перед этим, я пытаюсь отправить с преобразованием изображения в строку с использованием base64 и отправить мои другие данные и изображения, которые я конвертировал ранее с JSON , но я сталкиваюсь Проблема OutOfMemory здесь, поэтому я прочитал одно из решений, в котором говорилось, что я должен попробовать использовать MultipartEntityBuilder . Я все еще запутываюсь и не понимаю, как это сделать с помощью MultiPartEntityBuilder ли кто-нибудь помочь мне сделать это с помощью MultiPartEntityBuilder ? Это мой код:

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

Есть ли кто-нибудь, кто может помочь мне научить и рассказать мне, как отправлять JSON и Image с помощью MultiPartEntityBuilder?

Solutions Collecting From Web of "Android: загружать изображение и JSON с помощью MultiPartEntityBuilder"

Чтобы отправить двоичные данные, вам нужно использовать метод addBinaryBody для MultipartEntityBuilder . Пример крепления:

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

Затем выполните запрос как обычно:

 HttpPut put = new HttpPut("url"); put.setEntity(multipartEntity.build()); HttpResponse response = client.execute(put); int statusCode = response.getStatusLine().getStatusCode(); 

Есть мое решение для отправки изображений и текстовых полей (с apache http-библиотеками) с запросом POST. Json можно добавить таким же образом, как моя группа полей и владелец.

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

Загрузите httpcore-4.3.2.jar, httpmime-4.3.3.jar из Apache и добавьте их в папку lib в Android-проекте для использования MultipartEntityBuilder