我正在從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都沒用。你能告訴我我做錯了什麼嗎?謝謝!