如何发送zip文件而不在物理位置创建它?

时间:2012-03-19 07:25:10

标签: java java-ee

我想发送带有zip文件附件的电子邮件..我可以使用ByteArrayOutputStream发送pdf文件,而无需将它们保存在物理位置。但是当我尝试压缩那些文件时,发送它不起作用。它给予例外非法附件。

以下是我编写的用于创建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;
}

2 个答案:

答案 0 :(得分:2)

在写入每个项目后,在for循环结束时忘记调用zos.closeEntry()。 如上所述,您还没有关闭ZipOutputStream。

我认为你不需要调用entry.setSize()。

否则,这应该有用。

答案 1 :(得分:0)

我认为你没有脸红并关闭ZipOutputStream。尝试致电zos.flush(); zos.close()。我希望这将有所帮助。

如果没有尝试从ByteArrayOutputStream中提取字节数组,请将其保存到文件中并使用zip-enable工具打开。它只是用于调试,以确保您的ZIP正常并且没有损坏。