我使用javax.mail.internet.mimebody * 1.4.1版

我的程序希望使用Mimemultipart从服务器发送多个嵌套级别的二进制数据。我观察到,如果我们使用GetContent,它会损坏数据。我能够用这个片段来重现这个问题

  public static void CreateResponse() throws Exception {
        //Simulate the Server side
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        MimeMultipart multiPartValues = new MimeMultipart();
        MimeBodyPart valueBody = new MimeBodyPart();

        byte[] firstKeyValue = new byte[] { (byte)0x8c};
        valueBody.setContent(firstKeyValue,"application/octet-stream");
        valueBody.addHeader(RestMessageHeaders.CONTENT_LENGTH,
                Integer.toString(firstKeyValue.length));
        multiPartValues.addBodyPart(valueBody);

        Object input = valueBody.getContent();
        System.out.println(String.format("input %02X", ((byte[])input)[0]));
        multiPartValues.writeTo(outputStream);

        //Simulate the client side
        byte[] mimeOutput = outputStream.toByteArray();

        ByteArrayDataSource ds = new ByteArrayDataSource(mimeOutput,
                "multipart/mixed");
        MimeMultipart mp = new MimeMultipart(ds);
        MimeBodyPart part = (MimeBodyPart) mp.getBodyPart(0);

        byte[] myOutput = new byte[1];
        //Verified that getContent returns a String, why ?? 
        Object output = part.getContent();
        System.out.println("getContent type " + output.getClass());
        String result = (String)output;
        ByteArrayDataSource partDS = new ByteArrayDataSource(result, "multipart/mixed");
        partDS.getInputStream().read(myOutput); 
        System.out.println(String.format("getContent %02X %02X", result.getBytes()[0],result.getBytes()[1]));
        System.out.println(String.format("getContent %02X", myOutput[0]));

        part.getInputStream().read(myOutput);
        System.out.println(String.format("getInputStream %02X", myOutput[0]));

        part.getRawInputStream().read(myOutput);
        System.out.println(String.format("getRawInputStream %02X", myOutput[0]));

}
.

这是输出

        input 8C
        getContent type class java.lang.String
        getContent C2 8C
        getContent C2
        getInputStream 8C
        getRawInputStream 8C
.

我在这里完全简化了代码,它看起来很明显,使用get(RAW)Inputstream,但我们有巢似鹦鹉,顶级正在做GetContent,这导致某些情况失败了。

  1. 输入是字节阵列类型,但在客户端上的响应字符串响应。该服务器将内容设置为应用程序/八位字节流,但在客户端上将其输出为字符串。这里出了什么问题?
  2. 我不确定为什么在8c之前添加字节c2。关于8C角色是如此特别?
  3. getInputStream和GetraWinputStream之间有什么区别。何时使用一个过另一个?
有帮助吗?

解决方案

完整的流包含服务器正在创建的内容和客户端正在读取?

请注意,通过使用mimemultipart而没有mimemessage,您缺少MimeMessage自动为您自动完成的东西,特别是您缺少对MimemultIpart.updateHeaders()的调用。由于该方法受到保护,因此您需要在调用WriteTo之前将MimeMultIpart和该方法呼叫。如果这没有解决问题,请向我们展示正在写入并读取的确切数据。

如上所述,如果您期待二进制数据,您几乎肯定希望使用getInputStream。getrawinputstream在已解码之前为您提供数据,例如,Base64输入而不是二进制输出。

其他提示

如果返回字符串,请不要使用getContent(),并且您想要二进制文件。字符串不是二进制数据的容器。使用getInputStream()并复制字节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top