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

Java 如何发送zip文件而不在物理位置创建它?,java,jakarta-ee,Java,Jakarta Ee,我想发送带有zip文件附件的电子邮件。。我可以使用ByteArrayOutputStream发送pdf文件,而无需将其保存在物理位置。但是当我尝试压缩这些文件并发送它时,它不起作用。它给出了非法附件的例外情况 下面是我为创建zip而编写的代码 private MimeBodyPart zipAttachment( List<ByteArrayOutputStream> attachmentList, List<String> reportFileNames ) {

我想发送带有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;
}
私有MimeBodyPart zipAttachment(列表附件列表,列表报告文件名)
{
MimeBodyPart messageBodyPart=null;
尝试
{
//File File=File.createTempFile(“Reports.zip”,“.tmp”);
//FileOutputStream fout=新的FileOutputStream(文件);
ByteArrayOutputStream bout=newbytearrayoutputstream(attachmentList.size());
ZipOutputStream zos=新的ZipOutputStream(回合);
ZipEntry入口;
对于(int i=0;i
我认为您没有刷新并关闭ZipoutStream。尝试调用
zos.flush();zos.close()
。我希望这会有所帮助


如果不尝试通过tearrayoutputstream从
提取字节数组
,请将其保存到文件中并使用zip启用工具打开。这只是为了调试,以确保您的ZIP是正常的,没有损坏

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

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

否则,这应该是可行的