我正在尝试弄清楚如何将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流可以做到这一点,顺便提一下任何帮助或建议!
[09/29/2011]
我创建了一个非常简单的DataSource
实现,称为(猜测是什么)ByteArrayDataSource
,所以我有自动头设置和Base64编码。
答案 0 :(得分:3)
其中一个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()));