我正在使用 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);
........
我计划做的一些改变是:
- 创建 ByteArrayDataSource 实例时,将 mime 类型设置为 application/zip 而不是 text/plain。
- 可能根本不使用压缩,因为我发送的数据非常小,所以使用 parameters.setCompressionMethod(Zip4jConstants.COMP_STORE);
查看了这个主题http://www.lingala.net/zip4j/forum/index.php?topic=434.msg1297#msg1297,但这适用于 AES 加密,这里我使用的是 ENC_METHOD_STANDARD 所以我认为这不是申请。
知道出了什么问题吗?