Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解
上周做了一个需求,要求将数据库保存的html界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台;在数据库中保存的是html标签,查出后,我把这些内容写入css和js等其他文件所在目录的一个文件内,然后将这整个文件夹压缩打包下载,解决过程中遇到了下载出来后并没有保存层级目录,在查了好久方法后完成了如下版本,已经可以正常下载并保留层级目录。
//ZIP文件包压缩下载
@Override
publicvoiddownloadZip(Stringid,HttpServletResponseresponse){
StringzipPath="你的路径";
Filefile=newFile(zipPath,"index.html");//创建指定目录和文件名称的文件对象
BufferedWriterbw=null;//创建缓冲流
try{
//校验文件目录是否存在,文件是否存在
chenkFile(file,zipPath);
//这一步是我将指定内容从数据库写入文件
ModuleInfomoduleInfo=moduleDao.getByModId(id);
bw=newBufferedWriter(newFileWriter(file));
//把内容写入临时文件中
bw.write(moduleInfo.getContent());
//此处不能删除,要关闭一次不关闭无法写入内容导致压缩包内文件无内容
bw.flush();
bw.close();
//将目标文件压缩为ZIP并下载
ZipUtil.zip(zipPath,response);
//删除文件(防止下一次压缩时有重复文件名)
file.delete();
}catch(Exceptione){
log.error("html压缩"+e.getMessage(),e);
}finally{
//这是我写的IO流关闭工具类如需要可以看我关于IO流关闭的文章
IOCloseUtils.ioClose(bw);
}
}
//判断文件目录和文件是否存在如否则新建
publicvoidchenkFile(Filefile,Stringpath){
try{
if(file.exists()){//如果目录存在
if(!file.isDirectory()){//如果文件不存在
file.createNewFile();//创建文件
}
}else{//如果目录不存在
Filefile1=newFile(path);//创建指定目录文件对象
file1.mkdirs();//创建目录
file.createNewFile();//创建文件
}
}catch(IOExceptione){
log.error(e.getMessage(),e);
}
}
publicstaticvoidzip(StringsourceFileName,HttpServletResponseresponse){
ZipOutputStreamout=null;
BufferedOutputStreambos=null;
try{
//将zip以流的形式输出到前台
response.setHeader("content-type","application/octet-stream");
response.setCharacterEncoding("utf-8");
//设置浏览器响应头对应的Content-disposition
//参数中testZip为压缩包文件名,尾部的.zip为文件后缀
response.setHeader("Content-disposition",
"attachment;filename="+newString("testZip".getBytes("gbk"),"iso8859-1")+".zip");
//创建zip输出流
out=newZipOutputStream(response.getOutputStream());
//创建缓冲输出流
bos=newBufferedOutputStream(out);
FilesourceFile=newFile(sourceFileName);
//调用压缩函数
compress(out,bos,sourceFile,sourceFile.getName());
out.flush();
log.info("压缩完成");
}catch(Exceptione){
log.error("ZIP压缩异常:"+e.getMessage(),e);
}finally{
IOCloseUtils.ioClose(bos,out);
}
}
publicstaticvoidcompress(ZipOutputStreamout,BufferedOutputStreambos,FilesourceFile,Stringbase){
FileInputStreamfos=null;
BufferedInputStreambis=null;
try{
//如果路径为目录(文件夹)
if(sourceFile.isDirectory()){
//取出文件夹中的文件(或子文件夹)
File[]flist=sourceFile.listFiles();
if(flist.length==0){//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
out.putNextEntry(newZipEntry(base+"/"));
}else{//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
for(inti=0;i
如图下载后如图所示,名为testZip.zip的文件层级目录都有保留
总结
到此这篇关于Java将文件夹保留目录打包为ZIP压缩包并下载的教程详解的文章就介绍到这了,更多相关java将文件打包为zip压缩包下载内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。