Невозможно распаковать zip-файл, созданный библиотекой zip4j java - PullRequest
0 голосов
/ 13 апреля 2019

Я использую Zip4j для преобразования некоторых строковых данных в zip-файл, защищенный паролем.Затем я отправляю этот zip-файл в виде вложения по электронной почте.Проблема заключается в том, что иногда (частота отказов, например, 4%, остальные 96% времени, когда он работает), я не могу разархивировать (используя команду unzip на mac) файл, полученный в письме, ошибка, полученная при разархивировании файла,ниже:

 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. Вместо этого установите тип mime для application / ziptext / plain при создании экземпляра ByteArrayDataSource.
  2. Может вообще не использовать сжатие, так как данные, которые я отправляю, очень малы, поэтому используйте parameters.setCompressionMethod (Zip4jConstants.COMP_STORE);

Посмотрел эту тему http://www.lingala.net/zip4j/forum/index.php?topic=434.msg1297#msg1297, но это применимо для шифрования AES, и здесь я использую ENC_METHOD_STANDARD, поэтому я предполагаю, что это не применимо.

Любая идея, что идет не так

...