java - 如何在不在物理位置创建 zip 文件的情况下发送它?

标签 java jakarta-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;
}

最佳答案

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

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

否则,这应该可以工作。

关于java - 如何在不在物理位置创建 zip 文件的情况下发送它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9766420/

相关文章:

java - JSoup BodyAsBytes 连接到 FileOutputStream 以保存临时文件不起作用?

java - 在 GWT 中,是否可以将文件上传重定向到另一个 REST 服务?

java - servlet映射 "javax.ws.rs.core.Application"指的是未定义的servlet

Apache Shiro 与 Java EE 原生 API

java - Eclipse -> Run as -> Run on server - 如何让它与 JBoss 一起工作?

带有 Java 9 和 ClassPath 的 javax.smartcardio

java - 用tomcat PermGen空间做什么

java - 使用以 String 数组作为元素的 ArrayList 填充 ListView

java - 在db2数据库中存储200mb文件

jakarta-ee - 由于未定义的组件类型 jakarta.faces.ViewRoot,在 TOMEE-9.0 PLUS 上运行简单的 JSF Web 应用程序无法正常启动