3

我正在MimeMessage为带有字节数组的 Tiff 图像创建附件。

ByteArrayOutputStream out = new ByteArrayOutputStream();
MimeBodyPart body = new MimeBodyPart();
body.setContent(tiffByteArray, "image/tiff");
body.setDisposition("attachment");
body.setFileName(filename);
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(body);
MimeMessage message = new MimeMessage(Session.getDefaultInstance(System.getProperties()));
message.setContent(multipart);
message.writeTo(out);
String mimeContent = out.toString();

这通常有效。图像在消息中被转换为 base64 字符串。然而,在某些时候系统上发生了一些事情,这段代码开始使用com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler. 这种特殊的转换需要一个java.awt.Image对象,而不是一个字节数组(相关来源)。我收到以下错误:

无法将图像编码为流 ImageDataContentHandler 需要 Image 对象,被赋予类型类 [B

我可以看到你可以设置javax.activation.DataHandleron thejavax.mail.internet.MimeMessage和 inDataHandler你可以设置 the javax.activation.DataContentHandlerFactory,但我不确定将它设置为什么。

有没有办法强制将字节数组转换为 base64 编码的字符串,而不管 mime 类型如何?

4

1 回答 1

3

javax.mail提供DataSource可以显式使用的字节实现。

ByteArrayDataSource dataSource = new ByteArrayDataSource(tiffByteArray, "image/tiff");
DataHandler byteDataHandler = new DataHandler(dataSource);
body.setDataHandler(byteDataHandler);
body.setDisposition("attachment");
body.setFileName(filename);
于 2016-07-26T13:17:57.800 回答