热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了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 

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

在这里插入图片描述

总结

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


推荐阅读
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • Canopy环境安装与使用指南
    《利用Python进行数据分析》一书推荐使用EPDFree版本的环境,然而随着技术的发展,目前更多人倾向于使用Canopy。本文将详细介绍Canopy的安装及使用方法。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 本文介绍了如何利用 Apache NiFi 的灵活性和扩展性,通过自定义组件来解决标准组件无法满足的特定业务需求。文章不仅涵盖了自定义处理器的基本步骤,还讨论了调试自定义组件时可能遇到的问题及解决方案。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
author-avatar
浪费小创_512
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有