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

  介绍

这篇文章主要介绍Java将文件夹保留目录打包为ZIP压缩包并下载的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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

//ZIP文件包压缩下载   @Override   公共空间downloadZip (String id, HttpServletResponse响应){   字符串zipPath=澳愕穆肪丁?   文件文件=新文件(zipPath,“index.html");//创建指定目录和文件名称的文件对象   BufferedWriter bw=零;//创建缓冲流   尝试{//校验文件目录是否存在,文件是否存在   chenkFile(文件,zipPath);//这一步是我将指定内容从数据库写入文件   ModuleInfo ModuleInfo=moduleDao.getByModId (id);      bw=new BufferedWriter(新FileWriter(文件);//把内容写入临时文件中   bw.write (moduleInfo.getContent ());//此处不能删除,要关闭一次不关闭无法写入内容导致压缩包内文件无内容   bw.flush ();   bw.close ();//将目标文件压缩为邮政并下载   ZipUtil.zip (zipPath、响应);//删除文件(防止下一次压缩时有重复文件名)   file.delete ();   }捕捉(异常e) {   log.error (“html压缩“+ e.getMessage (), e);   最后}{//这是我写的IO流关闭工具类如需要可以看我关于IO流关闭的文章   IOCloseUtils.ioClose (bw);   }   }//判断文件目录和文件是否存在如否则新建   公共空间chenkFile(文件文件、字符串路径){   尝试{   如果(file.exists()){//如果目录存在   如果(! file.isDirectory()){//如果文件不存在   file.createNewFile();//创建文件   }   其他}{//如果目录不存在   文件file1=新文件(路径);//创建指定目录文件对象   file1.mkdirs();//创建目录   file.createNewFile();//创建文件   }   }捕捉(IOException e) {   log.error (e.getMessage (), e);   }   }
公共静态孔隙压缩(字符串sourceFileName HttpServletResponse响应){
  ZipOutputStream=零;
  BufferedOutputStream bos=零;
  尝试{//将zip以流的形式输出到前台
  response.setHeader (“content-type",“应用程序/octet-stream");
  response.setCharacterEncoding (“utf-8");//设置浏览器响应头对应的附加项//参数中testZip为压缩包文件名,尾部的。邮政为文件后缀
  response.setHeader (“Content-disposition"
  “附件文件名=?+新的字符串(“testZip" .getBytes (“gbk"),“iso8859-1") +“.zip");//创建zip输出流=新ZipOutputStream (response.getOutputStream ());//创建缓冲输出流
  bos=new BufferedOutputStream(出);
  文件的源文件=新文件(sourceFileName);//调用压缩函数
  压缩(bos,源文件,sourceFile.getName ());
  out.flush ();
  log.info(“压缩完成“);
  }捕捉(异常e) {
  log.error (“ZIP压缩异常:“+ e.getMessage (), e);
  最后}{
  IOCloseUtils.ioClose (bos);
  }
  }
  
  公共静态孔隙压缩(ZipOutputStream, BufferedOutputStream bos文件源文件、字符串基地){
  FileInputStream安全系数=零;
  BufferedInputStream bis=零;
  尝试{//如果路径为目录(文件夹)
  如果(sourceFile.isDirectory ()) {//取出文件夹中的文件(或子文件夹)
  文件[]弗利斯特雨=sourceFile.listFiles ();
  如果(弗利斯特雨。长度==0){//如果文件夹为空,则只需在目的地压缩文件中写入一个目录进入点
  出去了。putNextEntry(新ZipEntry(基础+“/?);
  其他}{//如果文件夹不为空,则递归调用压缩、文件夹中的每一个文件(或文件夹)进行压缩
  for (int i=0;我& lt;flist.length;我+ +){
  压缩(bos,弗利斯特雨[我],基地+“/?+弗利斯特雨[我]. getname ());
  }
  }
  其他}{//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
  出去了。putNextEntry(新ZipEntry(基地));
  安全系数=new FileInputStream(源文件);
  bis=new BufferedInputStream (fos)提交;
  
  int标签;//将源文件写入到zip文件中
  在((标签=bis.read ()) !=1) {
  out.write(标签);
  }
  
  bis.close ();
  fos.close ();
  }
  }捕捉(异常e) {
  e.printStackTrace ();
  最后}{
  IOCloseUtils.ioClose (bis,安全系数);
  }
  }

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