2013-03-25 44 views
2

我正在從Android客戶端向Tomcat服務器發送圖像和json文本,並使用Multipart HttpPost發送其他方式。將多部分實體發送到服務器沒什麼大不了的,因爲您可以使用request.getPart(<name>)輕鬆處理這些部分。但在客戶端,您只能以Stream的形式訪問響應。所以我最終將JSON字符串和圖像追加到ServletOutputStream,並且必須在客戶端手動解析它們。我在網絡上發現了apache-mime4j,但它幾乎沒有記錄,我無法找到一個示例如何使用它。解析Android中的多部分響應

在服務器端,我建立這樣的迴應:

ServletResponse httpResponse = ctx.getResponse(); 
ResponseFacade rf = (ResponseFacade) httpResponse; 
rf.addHeader("Access-Control-Allow-Origin", "*"); 
rf.addHeader("Access-Control-Allow-Methods", "POST"); 
rf.addHeader("content-type", "multipart/form-data"); 
httpResponse.setCharacterEncoding("UTF-8"); 

MultipartResponse multi = new MultipartResponse((HttpServletResponse) httpResponse); 
ServletOutputStream out = httpResponse.getOutputStream(); 

multi.startResponse("text/plain"); 
out.println(CMD + "#" + content); 
multi.endResponse(); 

multi.startResponse("image/jpeg"); 
out.write(data); 
multi.endResponse(); 

multi.finish(); 

ctx.complete(); 

而且在客戶端在Android上我要訪問的文本和圖像數據:

InputStream is = response.getEntity().getContent(); 

MimeStreamParser parser = new MimeStreamParser(); 
MultipartContentHandler con = new MultipartContentHandler(); 
parser.setContentHandler(con); 

try { 
    parser.parse(is); 
     String json = con.getJSON();  //get extracted json string 
     byte[] imgBytes = con.getBytes(); //get extracted bytes 

} catch (MimeException e) { 
     e.printStackTrace(); 
} finally { 
    is.close(); 
} 

class MultipartContentHandler implements ContentHandler{ 

    public void body(BodyDescriptor bd, InputStream in) throws MimeException, IOException { 
     //if MIME-Type is "text/plain" 
     // process json-part 
     //else 
     // process image-part 
    } 

在該方法body(BodyDescriptor bd, InputStream in)我的整個回覆被視爲text\plain mime類型。所以我最終不得不再次手動解析每個字節,整個apache-mime4j都沒用。你能告訴我我做錯了什麼嗎?謝謝!

回答

3

好吧,我終於自己解決了。不,這是我做的:

首先,我需要在服務器端創建一個multipart/mixed響應。

ServletResponse httpResponse = ctx.getResponse();  
ResponseFacade rf = (ResponseFacade) httpResponse; 
httpResponse.setCharacterEncoding("UTF-8"); 
httpResponse.setContentType("multipart/mixed"); 
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, "SEPERATOR_STRING",Charset.forName("UTF-8")); 
entity.addPart("json", new StringBody(CMD + "#" + content, "text/plain", Charset.forName("UTF-8"))); 
entity.addPart("image", new ByteArrayBody(data, "image/jpeg", "file")); 

httpResponse.setContentLength((int) entity.getContentLength()); 

entity.writeTo(httpResponse.getOutputStream()); 
ctx.complete(); 

現在在客戶端來訪問我使用javax.mail API獲取HttpResponse的MIME-零件:可以用apache-mime-4j API來完成。

ByteArrayDataSource ds = new ByteArrayDataSource(response.getEntity().getContent(), "multipart/mixed"); 
MimeMultipart multipart = new MimeMultipart(ds);  
BodyPart jsonPart = multipart.getBodyPart(0); 
BodyPart imagePart = multipart.getBodyPart(1); 

但你不能使用原生API,而不是藉此一個http://code.google.com/p/javamail-android/

現在您可以繼續處理您的各個部分。

0

也可以與apache-mime-4j

HttpURLConnection conn = ...; 
final InputStream is = conn.getInputStream(); 
try { 
    final StringBuilder sb = new StringBuilder(); 
    sb.append("MIME-Version: ").append(conn.getHeaderField("MIME-Version")).append("\r\n"); 
    sb.append("Content-Type: ").append(conn.getHeaderField("Content-Type")).append("\r\n"); 
    sb.append("\r\n"); 

    parser.parse(new SequenceInputStream(new ByteArrayInputStream(sb.toString().getBytes("US-ASCII")), is)); 
} catch (final MimeException e) { 
    e.printStackTrace(); 
} finally { 
    is.close(); 
}