Добавьте рабочую книгу Apache POI в качестве вложения в MimeMessage Javamail без записи в файловую систему - PullRequest
7 голосов
/ 28 сентября 2011

Я пытаюсь выяснить, как передать WorkBook (из библиотеки Apache POI) «напрямую» в объект MimeMessage (из библиотеки Javamail) в качестве вложения, без необходимости записывать его непосредственно вфайловая система.

Самый простой способ сделать это выглядит следующим образом:

File attachmentSource = new File("tmpsource.xls");

WorkBook tmpWorkbook = new HSSFWorkBook();
//Do stuff with workbook
tmpWorkBook.write(new FileOutputStream(attachmentSource));

//Create all the Session, MimeMessage and MimeMultipart
MimeBodyPart attachment = new MimeBodyPart();
attachment.setDataHandler(new DataHandler(new FileDataSource(attachmentSource)));
attachment.setFileName(attachmentSource.getName());

//Do stuff with the message and send it

Таким образом, это работает, но я вынужден записать файл в FS.

Читая соответствующие вопросы, я узнал о ByteArrayInputStream и ByteArrayOutputStream и, похоже, решил мою проблему (если файл не набирает 2GB, что кажется очень маловероятным).

Надеюсь, я объяснилЯ думаю, что потоки ByteArray справятся со своей задачей, и мы ценим любую помощь или совет!

[29.09.2011] Я создал очень простую реализацию DataSourceназывается (угадайте, что) ByteArrayDataSource, поэтому у меня есть автоматическая настройка заголовков и кодировка Base64.

1 Ответ

4 голосов
/ 28 сентября 2011

Один из конструкторов MimeBodyPart принимает байтовый массив (содержимое вложения) в качестве аргумента.Так что просто запишите вашу книгу в ByteArrayOutputStream, преобразуйте этот поток в байтовый массив и передайте этот байтовый массив конструктору:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
tmpWorkBook.write(baos);
MimeBodyPart attachment = new MimeBodyPart(internetHeaders, baos.toByteArray());
// or MimeBodyPart attachment = 
//        new MimeBodyPart(new ByteArrayInputStream(baos.toByteArray()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...