我有以下方法将zip条目添加到ZipOutputStream:
private void addFile(String filename, byte[] bytes, ZipOutputStream zos, boolean encrypt) throws IOException {
ZipEntry entry = new ZipEntry(filename);
if (encrypt) {
entry.setMethod(ZipEntry.DEFLATED);
} else {
entry.setMethod(ZipEntry.STORED);
CRC32 crc32 = new CRC32();
crc32.update(bytes);
entry.setCrc(crc32.getValue());
entry.setSize(bytes.length);
entry.setCompressedSize(bytes.length);
}
zos.putNextEntry(entry);
zos.write(bytes);
zos.flush();
zos.closeEntry();
}
...我使用它打开一个新的ZipOutputStream(ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File(path))));
),将其方法设置为DEFLATED(zos.setMethod(ZipOutputStream.DEFLATED);
),然后调用以下文件(按顺序):
1.“mimetype”(对于这个文件,我将ZipEntry方法设置为STORED)
1.名为“META-INF”的子文件夹中的“manifest.xml”(META-INF/manifest.xml)
1.“content.xml”
1.“styles.xml”
1.“meta.xml”
1.“thumbnail.png”,位于名为“Thumbnails”的子文件夹中(“Thumbnails/thumbnail.png”)
1.“settings.xml”
最后,我调用ZipOutputStream(zos.close();
)的close方法。
如果我尝试直接打开它与OpenOffice,它问我什么样的文件,我试图打开,它说,该文件已损坏,最后它打开该文件...但如果我解压缩文件(我使用winrar),然后我再次压缩与相同的工具(winrar,我的意思是)没有任何变化,OpenOffice是能够打开没有任何问题的文件...
任何帮助?提前感谢!
4条答案
按热度按时间d4so4syb1#
zaq34kh62#
劳尔
看起来你的zip文件是完整和正确的,所以它不是导致问题的zip过程。
问题是,当您的进程为maniest.xml文件创建xml文件时,doctype dtd位置无效。
在manifest.xml中的行:
你也有一个manifest.rdf文件在zip的根目录下,当试图把东西放回一起时,它会抛出OO。我不知道你用来创建OpenOffice文档XML输出的过程,但这就是问题所在。你需要确保DTD的路径是正确的,或者从XML文件中删除DOCTYPE。
以下是如何手动修复OpenOffice ODT文件:
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/statusbar/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/accelerator/current.xml"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/accelerator/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/floater/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/popupmenu/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/progressbar/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/toolpanel/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/menubar/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/toolbar/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/images/Bitmaps/"/>
< manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/images/"/>
我不< manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration" manifest:full-path="Configurations2/"/>知道
我认为winrar可能会为你修复dtd路径问题。open office在修复它的时候也是如此。OO可以处理没有定义的DTD,它知道要找什么,但它不喜欢坏的DTD
希望这能帮你解决这个问题。我想知道你用什么来写XML。
qq24tv8q3#
我发现问题可能出在Windows上,你在传递给ZipEntry构造函数的文件名中提供了反斜杠,我把它们改为正斜杠,之后OpenOffice就不再抱怨odt被破坏了
4urapxun4#
在我的情况下,我取代
通过=〉