2014-06-16 26 views
11

Tôi cố gắng tải dữ liệu lên máy chủ, dữ liệu của tôi chứa nhiều hình ảnh và JSON lớn, trước khi tôi cố gắng gửi hình ảnh chuyển đổi thành chuỗi bằng cách sử dụng base64 và gửi dữ liệu và hình ảnh khác của tôi Tôi đã chuyển đổi trước đây với JSON, nhưng tôi phải đối mặt với vấn đề OutOfMemory ở đây, vì vậy tôi đọc một trong các giải pháp cho biết tôi phải thử sử dụng MultipartEntityBuilder. Tôi vẫn còn khó hiểu và không hiểu cách thực hiện với MultiPartEntityBuilder, Có ai có thể giúp tôi cách thực hiện với MultiPartEntityBuilder không? đây là mã của tôi:Android: tải lên hình ảnh và JSON bằng cách sử dụng 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; 

} 

có ai có thể giúp tôi dạy và cho tôi biết cách gửi JSON và hình ảnh bằng MultiPartEntityBuilder không?

Trả lời

24

Để gửi dữ liệu nhị phân, bạn cần sử dụng phương thức addBinaryBodyMultipartEntityBuilder. Mẫu gắn:

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

Sau đó, thực hiện yêu cầu như bình thường:

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

để JSON gửi nó như thế nào? – Menma

+0

@NenMa json chỉ là một chuỗi. Vì vậy, hãy gửi nó như văn bản thuần túy thông thường. Tôi đã cập nhật câu trả lời. – eleven

+0

vì vậy bạn có nghĩa là tôi phải chuyển đổi JSON của tôi thành String trước, phải không? – Menma

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

Tải httpcore-4.3.2.jar, httpmime-4.3.3.jar từ Apache và thêm chúng trong thư mục lib của dự án Android để sử dụng MultipartEntityBuilder

1

Có giải pháp của tôi, để gửi hình ảnh và trường văn bản (với ap thư viện http đau) với yêu cầu POST. Json có thể được thêm vào theo cùng một cách, như nhóm trường và chủ sở hữu của tôi.

  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 
Các vấn đề liên quan