问题:
下载文件夹压缩文件为zip格式时打开报不可预料的压缩文件末端,而且文件夹里有多个文件但是下载的压缩包里面只有一个文件,还是损坏的;

原因:
检查了自己的代码,发现没什么问题,然后上网查找有说是流没关闭的问题,按照先打开的流后关闭的原则,检查了发现没错啊,最后自己写了个demo也能正常压缩下载,一步步排查最后发现原因是:我给响应设置了内容的大小:

//设置文件总的大小response.setContentLengthLong(contentLength);

我把文件夹的所有文件的大小加起来然后再设置大小,没想到会导致下载压缩时出问题;

解决办法:去掉这行代码就好了

代码:

    @GetMapping("/down")public void down(HttpServletResponse response) {String fileZipName = "test.zip";fileZipName = new String(fileZipName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);response.addHeader("Content-Disposition", "attachment;fileName=" + fileZipName);response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));BufferedOutputStream bos = new BufferedOutputStream(zos)) {for (int i = 1; i <= 2; i++) {try (InputStream inputStream = getInputStream(i);BufferedInputStream bis = new BufferedInputStream(inputStream)) {//命名文件String fileName = "1\\2\\" + i + ".txt";zos.putNextEntry(new ZipEntry(fileName));int len;byte[] buf = new byte[10 * 1024];while ((len = bis.read(buf, 0, buf.length)) != -1) {bos.write(buf, 0, len);}bos.flush();} catch (IOException e) {log.error("下载文件异常 err:", e);}}} catch (IOException e) {log.error("下载文件异常 err:", e);}}public InputStream getInputStream(int i) {byte[] bytes = new byte[0];try {Path path = Paths.get("C:\\Users\\22891\\Desktop\\1\\2\\" + i + ".txt");bytes = Files.readAllBytes(path);} catch (IOException e) {e.printStackTrace();}return new ByteArrayInputStream(bytes);}

补充知识:
自动关闭流:try-with-resources
语法:

       try () {} catch (IOException e) {}

只要需要关闭的流是实现了AutoCloseable接口的,就可以写在try语句的括号里面,就不需要手动关闭流;
其实反编译其字节码可以看到,自动关闭流也是写了try-catch-finally来关闭的。

如果需要手动关闭可以使用apache的common工具类,代码会简洁点:

import org.apache.commons.io.IOUtils;
IOUtils.closeQuietly();

如果使用 MappedByteBuffer,关闭流的时候要重写其clean方法:

/*** 关闭 MappedByteBuffer流** @param buffer*/public static void clean(final Object buffer) {AccessController.doPrivileged(new PrivilegedAction() {@Overridepublic Object run() {try {Method getCleanerMethod = buffer.getClass().getMethod("cleaner");getCleanerMethod.setAccessible(true);sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(buffer, new Object[0]);cleaner.clean();} catch (Exception e) {e.printStackTrace();}return null;}});}

下载文件夹压缩为zip格式时打开报不可预料的压缩文件末端相关推荐

  1. pythonshell压缩文件_文件夹压缩成zip格式

    前言: 在最近的后台开发工作中,需要将服务器的指定文件夹压缩,然后传输到前台.shell的zip命令可以很方便的实现该需求,python也有对应的模块,这里简要记录一下使用两种方式压缩文件的方法. s ...

  2. java 把文件打包成zip文件_java将文件或是文件夹打包压缩成zip格式

    导读热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.BufferedInputStream; impo ...

  3. python 实现文件的批量压缩为.zip格式+.zip格式文件的解析

    python 实现文件的批量压缩为.zip格式+.zip格式文件的解析 python 实现文件的批量压缩为.zip格式 Python解析.zip文件的常见函数 python 实现文件的批量压缩为.zi ...

  4. java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)

    这2个工具类都推荐使用统一个场景的不通过写法 推荐第一种 package com.gblfy.test;import java.io.BufferedInputStream; import java. ...

  5. RAR压缩文件如何转换成ZIP格式?

    压缩文件有多种不同的格式,有时候因为需求不同,我们需要把RAR压缩文件转换成ZIP格式,那要如何操作呢?下面小编分享2种简单的方法. 方法一: 如果需要转换的RAR压缩包不是很多,我们可以直接把文件名 ...

  6. windows 10 上传文件夹到 Linux服务器 压缩文件夹 到tar.gz格式

    有时候需要把win10上的一个文件夹传到Linux服务器上 简洁的做法是先压缩成 tar.gz 再用xftp上传 其中win端的压缩软件一般无法直接压缩成tar.gz格式 可用在cmd中 用命令压缩: ...

  7. vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)

    vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩) DLL:Ionic.Zip.dll 说明: 1.解压/压缩 显示加密进度及总进度. 2.zip文件打开,浏览内部文件. ...

  8. xml遍历文件夹vector_怎么统计指定文件夹下含有.xml格式的文件数目

    如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...

  9. php将文件夹打包zip文件,php将文件夹打包成zip文件

    php将文件夹打包成zip文件:function addFileToZip($path,$zip){ $handler=opendir($path); //打开当前文件夹由$path指定. while ...

  10. python小操作——读取文件夹内的任意格式文件到txt并排序

    概述: 懒得一个一个的对文件进行备注,想着先把所有的文件名放在一起,最后还想着加个序号 实现效果图: 代码: 1.0版本不太简便,以后有时间会对def Test()化简一下,精简一下代码. ####读 ...

最新文章

  1. 通过Katalon Automation Recorder 3步实现自动化测试
  2. Xshell 连接 Ubuntu
  3. python地板除与除法的区别_“地板除”还是“取整除”?地板除和天花板除floor division和ceil devision...
  4. C语言结构体内存对齐问题
  5. Linux文件的三个时间概念
  6. 160429、nodejs--Socket.IO即时通讯
  7. Makedown文件保存问题
  8. 中国各省级行政区公共数据开放平台网址(2021.11.1更新)
  9. 不用镜像,也不下载安装包,windows下安装Ruby
  10. rs232与db9接线方式
  11. 工业机器人的构成和分类
  12. 在解锁Redmi 5A
  13. 设计模式----策略模式
  14. 【消息队列----ActiveMQ】基本原理
  15. 关于WIN10系统无法打开CHM文件
  16. 潜在语义索引(LSI)
  17. [无线连接手机]-通过局域网无线连接调试手机设备
  18. java版湛蓝的回忆_湛蓝回忆 | 假情绪love | 橙光作品
  19. LeetCode Singer Number
  20. 银联开放平台在线课堂,上线啦

热门文章

  1. 计算机网络【最终版】
  2. IE8 正式版官方下载链接
  3. Unity 反转法线,在 Hierarchy 视图对象的快捷菜单中增加 Flip Mesh Normals(反转网格法线)项...
  4. force transducer and acceleration transducer
  5. Ubuntu 出现/usr/bin/ld: cannot find -lXp的问题
  6. 手游本地化不得不看的10条规则
  7. 左偏树(XJT Love Trees,玲珑杯 Round#8 C lonlife 1081)
  8. w7无法訪问计算机上硬盘分区,Win7/win10双系统无法打开磁盘分区提示拒绝访问怎么解决...
  9. 广告创意设计的灵感来源
  10. SpringBoot整合Activiti Modeler可视化流程定制