在内存中写入具有给定字节数组的ZipEntry

时间:2017-12-28 14:53:05

标签: java arrays zip

我有一个非常令人困惑的问题,希望我能在这里得到一些想法。

我的问题非常简单,但我还没有找到解决方案。

我想创建一个包含ZipEntry的简单ZIP文件。 ZipEntry由给定的字节数组创建(保存在带有Hibernate的Postgres-DB中)。

当我将此字节数组放入ZipOutputStream.write(..)时,创建的ZIP文件总是损坏。我究竟做错了什么?

之后,ZIP文件将传输到FTP服务器。

ByteArrayOutputStream bos = new ByteArrayOutputStream();
final ZipOutputStream zipOut = new ZipOutputStream(bos);
String filename = "test.zip";

for(final Attachment attachment : transportDoc.getAttachments()) {
    log.debug("Adding "+attachment.getFileName()+" to ZIP file /tmp/"+filename);

    ZipEntry ze = new ZipEntry(attachment.getFileName());
    zipOut.putNextEntry(ze);
    zipOut.write(attachment.getFileContent());
    zipOut.flush();
    zipOut.closeEntry();
}

zipOut.close();
org.apache.commons.io.FileUtils.writeByteArrayToFile(new File("/tmp/"+filename), bos.toByteArray());

我很困惑,因为当我更换

zipOut.write(attachment.getFileContent()); //This is the byte array from db

zipOut.write("Bla bla".getBytes());
它工作了!

但是DB中的字节数组不会被破坏,因为它可以用

写入文件
org.apache.commons.io.FileUtils.writeByteArrayToFile(new File("/tmp/test.png"), attachment.getFileContent());

没问题。这是一个正确的文件。

我希望你有一些想法。

提前致谢。

修改

我尝试离线修复ZIP文件,然后显示以下消息:

zip warning: no end of stream entry found: cglhnngplpmhipfg.png

(此png文件是字节数组文件)

简单的unzip-command输出以下内容:

unzip created.zip 
Archive:  created.zip
error [created.zip]:  missing 2 bytes in zipfile
  (attempting to process anyway)
error [created.zip]:  attempt to seek before beginning of zipfile
  (please check that you have transferred or created the zipfile in the
appropriate BINARY mode and that you have compiled UnZip properly)
  (attempting to re-compensate)
replace cglhnngplpmhipfg.png? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
  inflating: cglhnngplpmhipfg.png    
  error:  invalid compressed data to inflate
file #2:  bad zipfile offset (local header sig):  24709
  (attempting to re-compensate)
  inflating: created.xml

编辑2:

当我将此文件写入文件系统并通过InputStream将此文件添加到ZIP时,它也不起作用!但是文件系统上的文件没问题。我可以毫无问题地打开图像。它很混乱

File tmpAttachment = new File("/tmp/"+filename+attachment.getFileName());
FileUtils.writeByteArrayToFile(tmpAttachment, attachment.getFileContent());
FileInputStream inTmp = new FileInputStream(tmpAttachment);
int len;
byte[] buffer = new byte[1024];
while ((len = inTmp.read(buffer)) > 0) {
     zipOut.write(buffer, 0, len);
}
inTmp.close();

编辑3:

此问题仅在我尝试添加"复杂"像png或pdf这样的文件。如果我在其中放入一个txt文件,它就可以工作。

2 个答案:

答案 0 :(得分:0)

问题不在Zip-Library本身。

使用错误模式传输到外部FTP服务器。 (不是二元)。

感谢大家的帮助。

答案 1 :(得分:-1)

closeEntry()之前尝试flush()。您还可以尝试使用ze.setSize(attachment.getFileContent().length)明确指定条目的大小。