Java 压缩(压缩)文件夹无效
我正在尝试使用ZipoutStream将文件从服务器压缩到文件夹中。 下载存档后,双击后无法打开。出现错误“压缩(压缩)文件夹无效”。但如果我从上下文菜单->7zip->打开文件打开它,它会正常工作。问题的原因是什么Java 压缩(压缩)文件夹无效,java,Java,我正在尝试使用ZipoutStream将文件从服务器压缩到文件夹中。 下载存档后,双击后无法打开。出现错误“压缩(压缩)文件夹无效”。但如果我从上下文菜单->7zip->打开文件打开它,它会正常工作。问题的原因是什么 sourceFileName="./file.txt"' sourceFile = new File(sourceFileName); try { //
sourceFileName="./file.txt"'
sourceFile = new File(sourceFileName);
try {
// set the content type and the filename
responce.setContentType("application/zip");
response.addHeader("Content-Disposition", "attachment; filename=" + sourceFileName + ".zip");
responce.setContentLength((int) sourceFile.length());
// get a ZipOutputStream, so we can zip our files together
ZipOutputStream outZip = new ZipOutputStream((responce.getOutputStream());
// Add ZIP entry to output stream.
outZip.putNextEntry(new ZipEntry(sourceFile.getName()));
int length = 0;
byte[] bbuf = new byte[(int) sourceFile.length()];
DataInputStream in = new DataInputStream(new FileInputStream(sourceFile));
while ((in != null) && ((length = in.read(bbuf)) != -1)) {
outZip.write(bbuf, 0, length);
}
outZip.closeEntry();
in.close();
outZip.flush();
outZip.close();
7Zip可以打开各种各样的zip格式,并且相对容忍奇怪的事情。Windows双击需要一种相对特定的格式,而且容忍度要低得多 您需要查找,然后使用十六进制编辑器(如hex editor Neo)查看您的文件(以及“好”文件),以查看可能的错误
(一种可能性是,你使用的是错误的压缩算法。还有几个其他的变化要考虑,特别是你是否生成了一个目录)。
可能是一个<代码>关闭< /代码>丢失。可能是Windows无法处理zip中的路径编码。可能是Windows在目录结构方面有困难,或者路径名包含(反)斜杠。所以这就是侦探工作,尝试不同的文件。如果立即将zip流式传输到HTTP响应,则必须调用i.o.
close
代码发布后: 问题是
setContentLength
给出了原始文件大小。但当给定时,它应该给出压缩的大小
DataInputStream
是不需要的,我们应该在这里轻松地执行
responce.setContentType("application/zip");
response.addHeader("Content-Disposition", "attachment; filename=file.zip");
//Path sourcePath = sourceFile.toPath();
Path sourcePath = Paths.get(sourceFileName);
ZipOutputStream outZip = new ZipOutputStream((responce.getOutputStream(),
StandardCharsets.UTF-8);
outZip.putNextEntry(new ZipEntry(sourcePath.getFileName().toString()));
Files.copy(sourcePath, outZip);
outZip.closeEntry();
finish
或close
结尾的拉链
outZip.finish();
//outZip.close();
in.close();
我不确定(关于最好的代码风格)是否已经是自己的了。
但是当不关闭finish()
时,必须调用flush()
将不够,因为最后数据会写入zip
对于包含西里尔字母的文件名,最好添加一个Unicode字符集,如UTF-8。事实上,让UTF-8成为全世界的世界语标准
最后一点注意:如果只有一个文件,就可以对
file.txt.gz
使用gzipoutstream
,或者查询浏览器的功能(请求参数),并将其压缩为file.txt
@kgСаааа欢迎;我很好奇ContentDisposition头中的文件名应该是“file.zip”,没有路径。不应给出内容长度,因为您不知道(是压缩的)。您应该将outZip.close替换为outZip.finish;关闭JEE服务器。对于一个文件,您可以使用GZipOutputStream,创建file.txt.gz.DataInputSteam用于特殊情况int/long和其他结构化数据。也许一个BufferedInputStream就可以了。在!=可以删除null。除了使用GZipOutputStream之外,我遵循了所有建议。但它还不起作用。如果我尝试将相同的代码粘贴到一个项目中,该项目只从本地计算机获取文件,将其打包并保存在本地计算机上(在本例中,服务器与客户端位于同一台计算机上),那么一切都正常。当我使用远程服务器时,可能会有一些特殊情况?windows上的7Zip在资源管理器菜单上有一个“测试存档”选项,这可能会有所帮助