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

Wesley13
• 阅读 747

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

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

话不多说,直接上代码,有不足的地方希望大哥们提出来一起探讨

 1     //ZIP文件包压缩下载
 2     @Override
 3     public void downloadZip(String id,HttpServletResponse response) {
 4            String zipPath = "你的路径";
 5         File file = new File(zipPath,"index.html");//创建指定目录和文件名称的文件对象
 6         BufferedWriter bw = null;//创建缓冲流
 7         try {
 8             //校验文件目录是否存在,文件是否存在
 9             chenkFile(file,zipPath);
10             //这一步是我将指定内容从数据库写入文件
11             ModuleInfo moduleInfo = moduleDao.getByModId(id);
12            
13             bw = new BufferedWriter(new FileWriter(file));
14             //把内容写入临时文件中
15             bw.write(moduleInfo.getContent());
16             //此处不能删除,要关闭一次 不关闭无法写入内容 导致压缩包内文件无内容
17             bw.flush();
18             bw.close();
19             //将目标文件压缩为ZIP并下载
20             ZipUtil.zip(zipPath,response);
21             //删除文件(防止下一次压缩时有重复文件名)
22             file.delete();
23         } catch (Exception e) {
24             log.error("html压缩"+e.getMessage(),e);
25         }finally {
26             //这是我写的IO流关闭工具类 如需要可以看我关于IO流关闭的文章
27             IOCloseUtils.ioClose(bw);
28         }
29     }
30 
31     //判断文件目录和文件是否存在 如否则新建
32     public void chenkFile(File file,String path){
33         try {
34             if (file.exists()){//如果目录存在
35                 if (!file.isDirectory()){//如果文件不存在
36                     file.createNewFile();//创建文件
37                 }
38             }else {//如果目录不存在
39                 File file1 = new File(path);//创建指定目录文件对象
40                 file1.mkdirs();//创建目录
41                 file.createNewFile();//创建文件
42             }
43         } catch (IOException e) {
44             log.error(e.getMessage(),e);
45         }
46     }

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包后保留层级目录下载 ZIP压缩 下载

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

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

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

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

求个关注不过分叭~~~

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

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Peter20 Peter20
3年前
mysql基础入门_thankszmy的博客
一、MYSQL安装下载完后,我们将zip包解压到相应的目录,这里我将解压后的文件夹放在C:\\web\\mysql8.0.15winx64下。打开刚刚解压的文件夹C:\\web\\mysql8.0.15winx64,在该文件夹下创建my.ini配置文件,编辑my.ini配置以下基本信息:mysql设置mysql客户端默认字符集
Wesley13 Wesley13
3年前
Java中zip的压缩和解压缩
在Java中可以使用ZipOutputStream和ZipInputStream来实现zip的压缩和解压缩操作,另外使用FileSystem也可以用来实现zip的解压缩,下面将介绍这几种方式,直接上代码。zip压缩待压缩文件目录结构:!(https://static.oschina.net/uploads/img/202102/2
Stella981 Stella981
3年前
AndroidStudio Gradle手动下载和安装
操作流程概述:下载好的压缩包和解压后的文件夹复制到gradle5.5.1all97z1ksx6lirer3kbvdnh7jtjg文件夹下,将gradle5.5.1all.zip.part文件删除,复制一份gradle5.5.1all.zip.lck文件,重命名为gradle5.5.1all.zip.ok,重启An
Wesley13 Wesley13
3年前
Java之HSF搭建demo
1、去阿里云官网下载Demoedasappdemo.zip2、下载AliTomcat和Pandora,注意红色下面字体   a)下载 AliTomcat,保存后解压至相应的目录(如:d:\work\tomcat\)。b)下载 Pandora容器,保存后将内容解压至上述保存的AliTomcat
Wesley13 Wesley13
3年前
linux常见压缩格式及deb安装包用法
ZIP格式评价:可能是目前使用的最多的文档压缩格式,跨平台。压缩率不高。压缩一个目录:\ziprarchive\_name.zipdirectory\_to\_compress解压缩:\unziparchive\_name.zipTAR格式评价:消耗cpu及时间少,仅仅是一个打包工具,并不负责压缩。
Wesley13 Wesley13
3年前
Java 解压zip压缩包
因为最近项目需要批量上传文件,而这里的批量就是将文件压缩在了一个zip包里,然后读取文件进行解析文件里的内容。因此需要先对上传的zip包进行解压。以下直接提供代码供参考:1.第一个方法是用于解压zip压缩包的方法。2.第二个方法是 删除该文件夹以及子目录和子目录文件的方法。3.第三个方法是删除 删除文件夹内所有文件和子目录的方法。因为
Wesley13 Wesley13
3年前
unittest框架,漂亮的报告BeautifulReport配置与错误截图详细解说
1.下载BeautifulReport模块下载地址:https://github.com/TesterlifeRaymond/BeautifulReport2.解压与存放路径下载BeautifulReport的完整.ZIP文件,然后解压,把整个文件包放到本地python的/Lib/sitepackages/目录下!(https://im
Wesley13 Wesley13
3年前
Linux 运维 9月30日 笔记 6.1
目录一、压缩打包介绍二、gzip压缩工具三、bzip2压缩工具四、xz压缩工具一、压缩打包介绍1.常见压缩文件Windows.rar.zip.7zLinux.zip.gz.bz2.xz.tar 二、gzip压缩工具
Stella981 Stella981
3年前
Linux常用快捷键和命令记录(二)
使用zip打包文件夹:(r 参数表示递归打包包含子目录的全部内容,9表示压缩级别,q 参数表示为安静模式,即不向屏幕输出信息,o,表示输出文件,需在其后紧跟打包输出文件名。)压缩级别最高9,最小1。$zipr9qoaijiao.zip/home/aijiao/Desktop使用 du 命令查看