作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试弄清楚如何将 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 流可以解决问题,顺便说一句,感谢任何帮助或建议!
[2011 年 9 月 29 日]我创建了一个非常简单的 DataSource
实现,称为(猜猜是什么)ByteArrayDataSource
,所以我有自动 header 设置和 Base64 编码。
最佳答案
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()));
关于java - 将 Apache POI 工作簿作为附件添加到 Javamail 的 MimeMessage 中,而无需在文件系统中写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7580571/
我是一名优秀的程序员,十分优秀!