Java 压缩(压缩)文件夹无效

Java 压缩(压缩)文件夹无效,java,Java,我正在尝试使用ZipoutStream将文件从服务器压缩到文件夹中。 下载存档后,双击后无法打开。出现错误“压缩(压缩)文件夹无效”。但如果我从上下文菜单->7zip->打开文件打开它,它会正常工作。问题的原因是什么 sourceFileName="./file.txt"' sourceFile = new File(sourceFileName); try { //

我正在尝试使用ZipoutStream将文件从服务器压缩到文件夹中。 下载存档后,双击后无法打开。出现错误“压缩(压缩)文件夹无效”。但如果我从上下文菜单->7zip->打开文件打开它,它会正常工作。问题的原因是什么

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在资源管理器菜单上有一个“测试存档”选项,这可能会有所帮助