下载文件夹压缩为zip格式时打开报不可预料的压缩文件末端
问题:
下载文件夹压缩文件为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格式时打开报不可预料的压缩文件末端相关推荐
- pythonshell压缩文件_文件夹压缩成zip格式
前言: 在最近的后台开发工作中,需要将服务器的指定文件夹压缩,然后传输到前台.shell的zip命令可以很方便的实现该需求,python也有对应的模块,这里简要记录一下使用两种方式压缩文件的方法. s ...
- java 把文件打包成zip文件_java将文件或是文件夹打包压缩成zip格式
导读热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.BufferedInputStream; impo ...
- python 实现文件的批量压缩为.zip格式+.zip格式文件的解析
python 实现文件的批量压缩为.zip格式+.zip格式文件的解析 python 实现文件的批量压缩为.zip格式 Python解析.zip文件的常见函数 python 实现文件的批量压缩为.zi ...
- java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)
这2个工具类都推荐使用统一个场景的不通过写法 推荐第一种 package com.gblfy.test;import java.io.BufferedInputStream; import java. ...
- RAR压缩文件如何转换成ZIP格式?
压缩文件有多种不同的格式,有时候因为需求不同,我们需要把RAR压缩文件转换成ZIP格式,那要如何操作呢?下面小编分享2种简单的方法. 方法一: 如果需要转换的RAR压缩包不是很多,我们可以直接把文件名 ...
- windows 10 上传文件夹到 Linux服务器 压缩文件夹 到tar.gz格式
有时候需要把win10上的一个文件夹传到Linux服务器上 简洁的做法是先压缩成 tar.gz 再用xftp上传 其中win端的压缩软件一般无法直接压缩成tar.gz格式 可用在cmd中 用命令压缩: ...
- vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)
vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩) DLL:Ionic.Zip.dll 说明: 1.解压/压缩 显示加密进度及总进度. 2.zip文件打开,浏览内部文件. ...
- xml遍历文件夹vector_怎么统计指定文件夹下含有.xml格式的文件数目
如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...
- php将文件夹打包zip文件,php将文件夹打包成zip文件
php将文件夹打包成zip文件:function addFileToZip($path,$zip){ $handler=opendir($path); //打开当前文件夹由$path指定. while ...
- python小操作——读取文件夹内的任意格式文件到txt并排序
概述: 懒得一个一个的对文件进行备注,想着先把所有的文件名放在一起,最后还想着加个序号 实现效果图: 代码: 1.0版本不太简便,以后有时间会对def Test()化简一下,精简一下代码. ####读 ...
最新文章
- 通过Katalon Automation Recorder 3步实现自动化测试
- Xshell 连接 Ubuntu
- python地板除与除法的区别_“地板除”还是“取整除”?地板除和天花板除floor division和ceil devision...
- C语言结构体内存对齐问题
- Linux文件的三个时间概念
- 160429、nodejs--Socket.IO即时通讯
- Makedown文件保存问题
- 中国各省级行政区公共数据开放平台网址(2021.11.1更新)
- 不用镜像,也不下载安装包,windows下安装Ruby
- rs232与db9接线方式
- 工业机器人的构成和分类
- 在解锁Redmi 5A
- 设计模式----策略模式
- 【消息队列----ActiveMQ】基本原理
- 关于WIN10系统无法打开CHM文件
- 潜在语义索引(LSI)
- [无线连接手机]-通过局域网无线连接调试手机设备
- java版湛蓝的回忆_湛蓝回忆 | 假情绪love | 橙光作品
- LeetCode Singer Number
- 银联开放平台在线课堂,上线啦
热门文章
- 计算机网络【最终版】
- IE8 正式版官方下载链接
- Unity 反转法线,在 Hierarchy 视图对象的快捷菜单中增加 Flip Mesh Normals(反转网格法线)项...
- force transducer and acceleration transducer
- Ubuntu 出现/usr/bin/ld: cannot find -lXp的问题
- 手游本地化不得不看的10条规则
- 左偏树(XJT Love Trees,玲珑杯 Round#8 C lonlife 1081)
- w7无法訪问计算机上硬盘分区,Win7/win10双系统无法打开磁盘分区提示拒绝访问怎么解决...
- 广告创意设计的灵感来源
- SpringBoot整合Activiti Modeler可视化流程定制