2011-09-28 4 views
6

Estoy tratando de averiguar cómo pasar un WorkBook (de la biblioteca de POI de Apache) "directamente" a un objeto MimeMessage (de la biblioteca Javamail) como un archivo adjunto, sin tener que escribirlo directamente en el sistema de archivos.Agregar un Libro de trabajo POI Apache como archivo adjunto a MimeMessage de Javamail sin escribir en el sistema de archivos

La forma más sencilla de hacer esto parece lo siguiente:

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 

De esta manera funciona, pero estoy obligado a escribir el archivo en el FS.

Mientras lee las preguntas relacionadas que se enteraron de ByteArrayInputStream y ByteArrayOutputStream y pareció resolver mi problema (menos que el archivo se hincha hasta 2GB que parece muy poco probable).

Espero haberme explicado, creo que las transmisiones ByteArray harán el truco, por cierto, ¡cualquier ayuda o consejo es apreciado!

[09/29/2011] he creado una aplicación muy simple DataSource llamada (adivinar qué) ByteArrayDataSource, así que tengo la configuración cabeceras automáticas y codificación Base64.

Respuesta

3

Uno de los constructores MimeBodyPart toma una matriz de bytes (el contenido del archivo adjunto) como argumento. Así que acaba de escribir su libro en un ByteArrayOutputStream, transformar esta corriente a una matriz de bytes, y pasar esta matriz de bytes en el constructor:

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, realmente esperaba que de esta manera funcionó, pero los datos binarios se escribe directamente en el cuerpo del correo, por lo que no se configuran encabezados automáticos geniales y no se codifica cool base64. :(¿Me estoy perdiendo de algo? – Minkiele

Cuestiones relacionadas