将文件夹保留目录打包为 ZIP 压缩包并下载

上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台;在数据库中保存的是html标签,查出后,我把这些内容写入css和js等其他文件所在目录的一个文件内,然后将这整个文件夹压缩打包下载,解决过程中遇到了下载出来后并没有保存层级目录,在查了好久方法后完成了如下版本,已经可以正常下载并保留层级目录。

话不多说,直接上代码,有不足的地方希望大哥们提出来一起探讨
     //ZIP文件包压缩下载
@Override
public void downloadZip(String id,HttpServletResponse response) {
String zipPath = "你的路径";
File file = new File(zipPath,"index.html");//创建指定目录和文件名称的文件对象
BufferedWriter bw = null;//创建缓冲流
try {
//校验文件目录是否存在,文件是否存在
chenkFile(file,zipPath);
//这一步是我将指定内容从数据库写入文件
ModuleInfo moduleInfo = moduleDao.getByModId(id); bw = new BufferedWriter(new FileWriter(file));
//把内容写入临时文件中
bw.write(moduleInfo.getContent());
//此处不能删除,要关闭一次 不关闭无法写入内容 导致压缩包内文件无内容
bw.flush();
bw.close();
//将目标文件压缩为ZIP并下载
ZipUtil.zip(zipPath,response);
//删除文件(防止下一次压缩时有重复文件名)
file.delete();
} catch (Exception e) {
log.error("html压缩"+e.getMessage(),e);
}finally {
//这是我写的IO流关闭工具类 如需要可以看我关于IO流关闭的文章
IOCloseUtils.ioClose(bw);
}
} //判断文件目录和文件是否存在 如否则新建
public void chenkFile(File file,String path){
try {
if (file.exists()){//如果目录存在
if (!file.isDirectory()){//如果文件不存在
file.createNewFile();//创建文件
}
}else {//如果目录不存在
File file1 = new File(path);//创建指定目录文件对象
file1.mkdirs();//创建目录
file.createNewFile();//创建文件
}
} catch (IOException e) {
log.error(e.getMessage(),e);
}
}
    public static void zip(String sourceFileName, HttpServletResponse response){
ZipOutputStream out = null;
BufferedOutputStream bos = null;
try {
//将zip以流的形式输出到前台
response.setHeader("content-type", "application/octet-stream");
response.setCharacterEncoding("utf-8");
// 设置浏览器响应头对应的Content-disposition
//参数中 testZip 为压缩包文件名,尾部的.zip 为文件后缀
response.setHeader("Content-disposition",
"attachment;filename=" + new String("testZip".getBytes("gbk"), "iso8859-1")+".zip");
//创建zip输出流
out = new ZipOutputStream(response.getOutputStream());
//创建缓冲输出流
bos = new BufferedOutputStream(out);
File sourceFile = new File(sourceFileName);
//调用压缩函数
compress(out, bos, sourceFile, sourceFile.getName());
out.flush();
log.info("压缩完成");
} catch (Exception e) {
log.error("ZIP压缩异常:"+e.getMessage(),e);
} finally {
IOCloseUtils.ioClose(bos,out);
}
} public static void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base){
FileInputStream fos = null;
BufferedInputStream bis = null;
try {
//如果路径为目录(文件夹)
if (sourceFile.isDirectory()) {
//取出文件夹中的文件(或子文件夹)
File[] flist = sourceFile.listFiles();
if (flist.length == 0) {//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
out.putNextEntry(new ZipEntry(base + "/"));
} else {//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
for (int i = 0; i < flist.length; i++) {
compress(out, bos, flist[i], base + "/" + flist[i].getName());
}
}
} else {//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
out.putNextEntry(new ZipEntry(base));
fos = new FileInputStream(sourceFile);
bis = new BufferedInputStream(fos); int tag;
//将源文件写入到zip文件中
while ((tag = bis.read()) != -1) {
out.write(tag);
} bis.close();
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOCloseUtils.ioClose(bis,fos);
}
}

如图下载后如图所示,名为 testZip.zip 的文件 层级目录都有保留

发文不易,各位看官关注下公众号,谢谢!!!

关注公众号回复 ”jar包“ 获取 IDEA2020最新版破解jar包

教程在这 点击这里跳转教程

求个关注不过分叭~~~

JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载的更多相关文章

  1. java笔试题: ——将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面

    将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面 import java.io.*; import java.util.zip.ZipEntry; import java.uti ...

  2. rsync+inotify 实现资源服务器的同步目录下的文件变化时,备份服务器的同步目录更新,以资源服务器为准,去同步其他客户端

    测试环境: 资源服务器(主服务器):192.168.200.95 备份服务器(客户端):192.168.200.89 同步目录:/etc/test 同步时使用的用户名hadoop密码12345 实验目 ...

  3. SpringBoot项目打成jar包后上传文件到服务器 目录与jar包同级问题

    看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了.当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源.但是当你使用Sp ...

  4. SpringBoot打成jar包后,获取不到读取resources目录下文件路径的问题

    问题描述: Springboot没有打成jar之前,可以成功获取读取resources目录下xxx.json文件的 路径.但是打成jar包后,接口调不通,原因是获取不到文件的路径. 原因: 在本地进行 ...

  5. 把java的class文件打成jar包的步骤

    现在我的文件夹的目录在: C:\Users\linsenq\Desktop\cglibjar 我要把位于这个目录下的所有文件夹以及这个文件夹下的.class文件打成jar包 第一步:用win+R 打开 ...

  6. 项目引入非配置的文件,打成war包后测试报错的可能原因

    写在前边 这阵子有点忙,开发一个微服务项目中读取配置文件的时候在本地测试是可以的,但是一到测试环境就报错,经查看发现是因为发布的时候是用的war包,使用java -jar xxx.war启动的,所以用 ...

  7. Java基础之用记事本编辑java代码运行,并且打成jar包后运行

    使用记事本写java代码 1.在d盘新建一个记事本,名字叫做zhanzhuang.java,会询问不可用,是否继续,点击是 2.在里面编辑就如下内容,注意文件的名字要和 class 后面的名字相对应 ...

  8. IDEA将指定package(指定文件)打成jar包

    写在前面 真的是好记性不如烂笔头 需求 将项目中包名为org的package打成jar包 步骤 1.选择Artifacts>绿色+号>JAR>Empty name自定义, 我这里命名 ...

  9. php打包文件为ZIP包后下载到本地

    这是一个工作中需要打包下载当前产品的所有图片到本地,文件格式为ZIP压缩包,打包下载文件跟图片一样,本程序细节为实际情况,使用需按照自己实际情况书写:<?php/**************** ...

随机推荐

  1. v-forv-for指令的三种使用方法

    1.迭代数组 <p v-for="(item,i) in list">id:{{item.id}}---名字:{{item.name}}---索引{{item.age} ...

  2. 四层发现-TCP发现

    直接向目标ip发送一个ACK数据包,正常情况下up状态的目标ip会返回一个SRT数据包. 使用scapy构造TCP数据包: 然后在将一些数据类型设置好就可以发送了. 实用脚本实现批量扫描: #!/us ...

  3. Spark学习笔记(三)-Spark Streaming

    Spark Streaming支持实时数据流的可扩展(scalable).高吞吐(high-throughput).容错(fault-tolerant)的流处理(stream processing). ...

  4. ubuntu镜像源切换

    换源准备: 换源之前明确使用平台,X86架构.ARM架构的源,ubuntu18.04和unbuntu16.04等源均不同,切忌病急乱投医,看到一个源复制过来添加后没用. 分析一条源: deb http ...

  5. kubernetes资源均衡器Descheduler

    背景 Kubernetes中的调度是将待处理的pod绑定到节点的过程,由Kubernetes的一个名为kube-scheduler的组件执行.调度程序的决定,无论是否可以或不能调度容器,都由其可配置策 ...

  6. 面试官:你刚说你喜欢研究新技术,那么请说说你对 Blazor 的了解

    阅读本文大概需要 1.5 分钟. 最近在几个微信 .NET 交流群里大家讨论比较频繁的话题就是这几天自己的面试经历. 面试官:"你刚说你喜欢研究新技术,那么你对 Blazor 了解多少?&q ...

  7. bugku社工writeup

    最近bugku的web和杂项刷了多半,突然心血来潮想试试社工题,bugku的社工题比较基础,而且题量不多,和大家分享一下writeup. 1.密码 根据提示,多猜几次密码就对了,然后得到flag. 2 ...

  8. Python 简明教程 --- 20,Python 类中的属性与方法

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...

  9. git和github入门指南(1)

    1.git和github简介 1.1.git是什么?github是什么?git和github的关系? Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. Git ...

  10. sql 语句和实例

    修改字段格式的sql语句: alter table tablename alter column colname newDataType 比如:alter table mytable alter co ...