【问题标题】:parse Multipart response in Android在Android中解析多部分响应
【发布时间】:2013-03-25 23:58:51
【问题描述】:

我使用 Multipart HttpPost 将图像和 json 文本从 android 客户端发送到 tomcat 服务器,反之亦然。将多部分实体发送到服务器没什么大不了的,因为您可以使用request.getPart(<name>) 轻松处理这些部分。但是在客户端,您只能以 Stream 的形式访问响应。所以我最终将 JSON 字符串和图像都附加到同一个 ServletOutputStream 并且必须在客户端手动解析它们。我在网上找到了 apache-mime4j,但它几乎没有文档记录,我找不到一个如何使用它的示例。

在服务器端,我构建这样的响应:

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 都没用。你能告诉我我做错了什么吗?谢谢!

【问题讨论】:

    标签: android mime-types


    【解决方案1】:

    好吧,我终于自己解决了。不,这就是我所做的:

    首先我需要在服务器端创建一个multipart/mixed 响应。可以使用apache-mime-4j API 来完成:

    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/

    现在您可以继续处理您的各个部分。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 2018-08-20
        • 2015-07-01
        相关资源
        最近更新 更多