3

マルチパート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\plainMIME タイプとして扱われます。そのため、最終的にすべてのバイトを手動で再度解析する必要があり、apache-mime4j 全体が役に立たなくなります。私が間違っていることを教えてもらえますか?ありがとう!

4

2 に答える 2

5

わかりました、最終的に自分で解決しました。いいえ、私がしたことは次のとおりです。

multipart/mixedまず、サーバー側で Responseを作成する必要があります。apache-mime-4jAPIを使用して実行できます。

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

ここで、クライアント側で HttpResponse の MIME パーツにアクセスするために、javax.mail 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/を使用してください。

これで、個々のパーツの処理を続行できます。

于 2013-03-26T14:32:49.003 に答える
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();
}
于 2013-12-31T13:39:45.670 に答える