マルチパートHttpPostを使用して、AndroidクライアントからTomcatサーバーに画像とjsonテキストを送信しています。を使用してパーツを簡単に処理できるため、Multipart Entity をサーバーに送信することは大したことではありませんrequest.getPart(<name>)
。ただし、クライアント側では、ストリームとしてのみ応答にアクセスできます。そのため、JSON 文字列と画像の両方を同じものに追加することになりServletOutputStream
、クライアント側で手動で解析する必要があります。Webでapache-mime4jを見つけましたが、ほとんど文書化されておらず、使用方法の例が1つも見つかりません。
サーバー側では、次のように応答を作成します。
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 全体が役に立たなくなります。私が間違っていることを教えてもらえますか?ありがとう!