Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解

 更新时间:2020年08月13日 12:01:06   作者:Errol_King  
这篇文章主要介绍了Java将文件夹保留目录打包为 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 的文件 层级目录都有保留

在这里插入图片描述

总结

到此这篇关于Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解的文章就介绍到这了,更多相关java将文件打包为zip压缩包下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot项目打包发布部署的过程及jar和war的区别

    springboot项目打包发布部署的过程及jar和war的区别

    Spring Boot使用了内嵌容器,因此它的部署方式也变得非常简单灵活,可以将Spring Boot项目打包成JAR包来独立运行,Spring Boot项目既可以生成WAR包发布,也可以生成JAR包发布,那么它们有什么区别呢
    2022-11-11
  • springboot + mybatis + druid + 多数据源的问题详解

    springboot + mybatis + druid + 多数据源的问题详解

    这篇文章主要介绍了springboot + mybatis + druid + 多数据源的问题详解,示例代码文字相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java向List集合中批量添加元素的实现方法

    Java向List集合中批量添加元素的实现方法

    这篇文章主要介绍了Java向List集合中批量添加元素的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 新手了解java 多线程基础知识

    新手了解java 多线程基础知识

    这篇文章主要介绍了java 基础教程之多线程详解及简单实例的相关资料,线程的基本属性、如何创建线程、线程的状态切换以及线程通信,需要的朋友可以参考下
    2021-07-07
  • java实现页面置换算法

    java实现页面置换算法

    这篇文章主要为大家详细介绍了java实现页面置换算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • java操作json对象出现StackOverflow错误的问题及解决

    java操作json对象出现StackOverflow错误的问题及解决

    这篇文章主要介绍了java操作json对象出现StackOverflow错误的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java并发编程之常用的多线程实现方式分析

    Java并发编程之常用的多线程实现方式分析

    这篇文章主要介绍了Java并发编程之常用的多线程实现方式,结合实例形式分析了java并发编程中多线程的相关原理、实现方法与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • springboot使用TaskScheduler实现动态增删启停定时任务方式

    springboot使用TaskScheduler实现动态增删启停定时任务方式

    这篇文章主要介绍了springboot使用TaskScheduler实现动态增删启停定时任务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Flowable数据库表分类及数据字典解析

    Flowable数据库表分类及数据字典解析

    这篇文章主要介绍了Flowable数据库表分类及数据字典解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • spring boot 配置freemarker及如何使用freemarker渲染页面

    spring boot 配置freemarker及如何使用freemarker渲染页面

    springboot中自带的页面渲染工具为thymeleaf 还有freemarker这两种模板引擎,本文重点给大家介绍spring boot 配置freemarker及如何使用freemarker渲染页面,感兴趣的朋友一起看看吧
    2023-10-10

最新评论