介绍
这篇文章主要介绍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压缩包并下载的方法