0

我正在使用 Zip4j 将一些字符串数据转换为受密码保护的 zip 文件。接下来,我通过电子邮件将这个 zip 文件作为附件发送。问题是有时(失败率如 4%,其余 96% 的工作时间)我无法解压缩(在 mac 上使用 unzip 命令)我在电子邮件中收到的文件,解压缩文件时收到的错误为以下:

 7 extra bytes at beginning or within zipfile
  (attempting to process anyway)
file #1:  bad zipfile offset (local header sig):  7
  (attempting to re-compensate)

error:  invalid compressed data to inflate

似乎 zip 文件中的正文内容无关紧要,例如:第一次压缩和发送电子邮件不起作用,但再次使用相同的内容执行此操作。我无法在本地重现此内容。

    ByteArrayOutputStream byteArrayOutputStream = new 
    ByteArrayOutputStream();
    net.lingala.zip4j.io.ZipOutputStream zipOutputStream = new 
    net.lingala.zip4j.io.ZipOutputStream(byteArrayOutputStream);

    ZipParameters parameters = new ZipParameters();
    parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
  parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
    parameters.setEncryptFiles(true);
    parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
    parameters.setPassword("zipFilePassword");
    parameters.setFileNameInZip(subject + ".txt");
    parameters.setSourceExternalStream(true);
    zipOutputStream.putNextEntry(null, parameters);

    zipOutputStream.write("some regular text".getBytes());
    zipOutputStream.closeEntry();
    zipOutputStream.finish();

    DataSource attachment = new 
    ByteArrayDataSource(byteArrayOutputStream.toByteArray(), 
    "text/plain");
    MimeBodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setDataHandler(new DataHandler(attachment));
    messageBodyPart.setFileName(subject + ".zip");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);
    ........

我计划做的一些改变是:

  1. 创建 ByteArrayDataSource 实例时,将 mime 类型设置为 application/zip 而不是 text/plain。
  2. 可能根本不使用压缩,因为我发送的数据非常小,所以使用 parameters.setCompressionMethod(Zip4jConstants.COMP_STORE);

查看了这个主题http://www.lingala.net/zip4j/forum/index.php?topic=434.msg1297#msg1297,但这适用于 AES 加密,这里我使用的是 ENC_METHOD_STANDARD 所以我认为这不是申请。

知道出了什么问题吗?

4

0 回答 0