Контролировать, какой DataContentHandler использовать для вложения MimeMessage?

Я создаю приложение к 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, был задан объект типа class [B

Я вижу, что вы можете установить javax.activation.DataHandler на javax.mail.internet.MimeMessage и в DataHandler Вы можете установить javax.activation.DataContentHandlerFactory, но я не уверен, что его установить.

Есть ли способ принудительно преобразовать байтовый массив в строку, закодированную в base64, независимо от типа MIME?

1 ответ

Решение

javax.mail обеспечивает DataSource реализация для байтов, которые вы можете явно использовать.

ByteArrayDataSource dataSource = new ByteArrayDataSource(tiffByteArray, "image/tiff");
DataHandler byteDataHandler = new DataHandler(dataSource);
body.setDataHandler(byteDataHandler);
body.setDisposition("attachment");
body.setFileName(filename);
Другие вопросы по тегам