时间:2021-05-20
上周做了一个需求,要求将数据库保存的 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压缩包下载内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了Java多文件以ZIP压缩包导出的具体代码,供大家参考,具体内容如下1、使用java实现吧服务器的图片打包成一个zip格式的压缩包导出,多个
mysql5.7.20zip安装,具体内容如下(1)解压压缩包,并穿件data文件夹和my.ini文件。我解压的目录是D:/software/mysql-5.7
Mysql5.7.11绿色版安装教程图文详解如下所示:1、解压mysql-5.7.11压缩包到想要存放的磁盘文件夹中;2、在文件夹中新建一个data文件夹和新建
本文实例讲述了PHPzip压缩包操作类。分享给大家供大家参考,具体如下:zip=newZipArchive;}/***解压zip文件到指定文件夹**@acces
操作系统:win764位旗舰版mysql压缩包:mysql-5.7.11-winx64.zip1.解压MySQL压缩包将下载的MySQL压缩包解压到自定义目录下