【问题标题】:Android : upload Image and JSON using MultiPartEntityBuilderAndroid:使用 MultiPartEntityBuilder 上传图像和 JSON
【发布时间】:2014-06-16 08:58:13
【问题描述】:

我尝试将数据上传到服务器,我的数据包含多个图像和大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;

}   

有没有人可以帮助我教我如何使用 MultiPartEntityBuilder 发送 JSON 和 Image?

【问题讨论】:

    标签: android json http-post multipartentity


    【解决方案1】:

    要发送二进制数据,您需要使用MultipartEntityBuilderaddBinaryBody 方法。附件示例:

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

    【讨论】:

    • 那么对于JSON如何发送呢?
    • @NenMa json 只是一个字符串。所以像往常一样发送纯文本。我已经更新了答案。
    • 所以你的意思是我必须先将我的 JSON 转换为字符串,对吧?
    • anb btw 为什么我不能导入 org.apache.http.entity.ContentType; T.T ?
    • @NenMa 是的,您需要将您的 json 转换为字符串。 ContentTypehttpcore-4.3.2.jar 的一部分。你可以在这里下载:hc.apache.org/downloads.cgi
    【解决方案2】:

    有我的解决方案,用于通过 POST 请求发送图像和文本字段(使用 apache http 库)。可以以与我的字段组和所有者相同的方式添加 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
    

    【讨论】:

      【解决方案3】:
          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);
      

      从 Apache 下载 httpcore-4.3.2.jar 、 httpmime-4.3.3.jar 并将它们添加到 Android 项目的 lib 文件夹中,以便使用 MultipartEntityBuilder

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        相关资源
        最近更新 更多