2012-03-19 6 views
7

Deseo enviar correos electrónicos con archivos adjuntos zip. Puedo enviar archivos PDF sin guardarlos en una ubicación física usando ByteArrayOutputStream. Pero cuando intento comprimir esos archivos y enviarlos, no funciona. Da excepción apego ilegal.¿Cómo enviar un archivo zip sin crearlo en una ubicación física?

A continuación se muestra el código que he escrito para crear zip.

private MimeBodyPart zipAttachment(List<ByteArrayOutputStream> attachmentList, List<String> reportFileNames) 
{ 
    MimeBodyPart messageBodyPart = null; 
    try 
    { 
     // File file = File.createTempFile("Reports.zip",".tmp"); 
     // FileOutputStream fout = new FileOutputStream(file); 
     ByteArrayOutputStream bout = new ByteArrayOutputStream(attachmentList.size()); 
     ZipOutputStream zos = new ZipOutputStream(bout); 
     ZipEntry entry; 
     for(int i = 0; i < attachmentList.size(); i++) 
     { 
      ByteArrayOutputStream attachmentFile = attachmentList.get(i); 
      byte[] bytes = attachmentFile.toByteArray(); 
      entry = new ZipEntry(reportFileNames.get(i)); 
      entry.setSize(bytes.length); 
      zos.putNextEntry(entry); 
      zos.write(bytes); 
     } 
     messageBodyPart = new MimeBodyPart(); 
     DataSource source = new ByteArrayDataSource(bout.toByteArray(), "application/zip"); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName("Reports.zip"); 

    } 
    catch(Exception e) 
    { 
     // TODO: handle exception    
    } 
    return messageBodyPart; 
} 
+0

¿Se puede agregar stacktrace? –

Respuesta

0

creo que no ha vaciado y cerrado ZipOutputStream. Intenta llamar al zos.flush(); zos.close(). Espero que esto sea de ayuda.

Si no intenta extraer la matriz de bytes de su ByteArrayOutputStream, guárdela en un archivo y abra con la herramienta de habilitación de zip. Es solo para la depuración para asegurarse de que su ZIP esté correcto y no esté dañado.

2

Olvidó llamar a zos.closeEntry() después de escribir cada elemento, al final de su ciclo for. Y como se indicó, no ha cerrado su ZipOutputStream.

No creo que deba llamar a entry.setSize(), tampoco.

De lo contrario, esto debería funcionar.

Cuestiones relacionadas