Как отправить файл zip, не создавая его на физическом месте? - PullRequest
8 голосов
/ 19 марта 2012

Я хочу отправить электронное письмо с вложенным zip-файлом. Я могу отправлять pdf-файлы, не сохраняя их в физическом месте, используя ByteArrayOutputStream. Но когда я пытаюсь заархивировать эти файлы и отправить его не работает. Это дает исключение незаконного вложения.

Ниже приведен код, который я написал для создания 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 ]

2 голосов
/ 17 июля 2012

Вы забыли вызвать zos.closeEntry () после записи каждого элемента в конце цикла for.И, как уже было отмечено, вы не закрыли свой ZipOutputStream.

Я не думаю, что вам также нужно вызывать entry.setSize ().

В противном случае это должно сработать.

0 голосов
/ 19 марта 2012

Я думаю, что вы не покраснели и не закрылись ZipOutputStream.Попробуйте позвонить zos.flush(); zos.close().Я надеюсь, это поможет.

Если вы не попытаетесь извлечь байтовый массив из ByteArrayOutputStream, сохраните его в файл и откройте с помощью zip-enable tool.Это просто для отладки, чтобы убедиться, что ваш ZIP в порядке и не поврежден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...