2011-09-28 7 views
6

Tôi đang cố gắng tìm ra cách để chuyển một WorkBook (từ thư viện Apache POI) "trực tiếp" đến một đối tượng MimeMessage (từ thư viện Javamail)) dưới dạng tệp đính kèm, mà không phải viết trực tiếp trong hệ thống tệp.Thêm một Apache POI WorkBook dưới dạng tệp đính kèm vào MimeMessage của Javamail mà không cần viết trong hệ thống tập tin

Cách đơn giản nhất để làm điều này dường như sau:

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 

Bằng cách này nó hoạt động nhưng tôi buộc phải viết ra các tập tin vào FS.

Trong khi đọc các câu hỏi liên quan tôi đã tìm hiểu về ByteArrayInputStreamByteArrayOutputStream và dường như giải quyết được sự cố của tôi (Trừ khi tệp bị phồng lên 2GB có vẻ như rất khó xảy ra).

Tôi hy vọng tôi đã giải thích bản thân mình, tôi nghĩ rằng các luồng ByteArray sẽ thực hiện thủ thuật, bằng cách bất kỳ trợ giúp hoặc lời khuyên nào được đánh giá cao!

[2011/09/29] Tôi tạo ra một DataSource thực hiện rất đơn giản gọi là (đoán những gì) ByteArrayDataSource, vì vậy tôi có các thiết lập tiêu đề tự động và mã hóa Base64.

Trả lời

3

Một trong số các nhà xây dựng MimeBodyPart có một mảng byte (nội dung của tệp đính kèm) làm đối số. Vì vậy, chỉ cần viết bảng tính của bạn đến một ByteArrayOutputStream, biến đổi dòng này để một mảng byte, và vượt qua mảng byte này để các nhà xây dựng:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
tmpWorkBook.write(baos); 
MimeBodyPart attachment = new MimeBodyPart(internetHeaders, baos.toByteArray()); 
// or MimeBodyPart attachment = 
//  new MimeBodyPart(new ByteArrayInputStream(baos.toByteArray())); 
+0

Ok, tôi thực sự hy vọng rằng cách này làm việc nhưng các dữ liệu nhị phân được viết thẳng vào cơ thể thư, do đó, không có tiêu đề tự động mát mẻ được thiết lập và không có mã hóa base64 mát mẻ. :(Tui bỏ lỡ điều gì vậy? – Minkiele