如何在java中压缩文件并下载?

本教程操作环境:windows7系统、java10版,DELL G3电脑。

1、ZIP文件格式

[localfileheader+filedata+datadescriptor]{1,n}+centraldirectory+endofcentraldirectoryrecord
即
[文件头+文件数据+数据描述符]{此处可重复n次}+核心目录+目录结束标识

当压缩包中有多个文件时,就会有多个[文件头+文件数据+数据描述符]

2、压缩和下载步骤

(1)创建压缩包前准备

//定义压缩包存在服务器的路径
Stringpath=request.getSession().getServletContext().getRealPath("/WEB-INF/fileTemp");
//创建路径
FileFilePath=newFile(path+"/file");
if(!FilePath.exists()){
FilePath.mkdir();
}
Stringpath=FilePath.getPath()+"/";
//定义导出压缩包的名称
Stringtitle="问价压缩包";
//压缩包格式
StringfileNamezip=title+".zip";
StringzipPath=path+fileNamezip;
//创建一个ZIP输出流并实例化缓冲区域
ZipOutputStreamout=newZipOutputStream(newBufferedOutputStream(newFileOutputStream(zipPath)));
//设置编码格式(解决linux出现乱码)
out.setEncoding("gbk");
//定义字节数组
bytedata[]=newbyte[2048];

//获取文件记录(获取文件记录代码省略)
ListFileList=。。。;
if(!FileList.isEmpty()){
ExportUtilutil=newExportUtil(title,title,
request,response,FilePath.getPath());
}

(2)删除压缩包之前的数据,创建压缩包

util.startZip(FilePath.getPath());

(3)循环将需要压缩的文件放到压缩包中

for(inti=0;i<FileList.size();i++){
fileVofileVo=FileList.get(i);
export(fileVo,request,response,title,FilePath.getPath(),fileName);
}
------
publicvoidexport(fileVofileVo,HttpServletRequestrequest,
HttpServletResponseresponse,Stringtitle,Stringpath,StringfileName){
FileOutputStreamfileOutputStream=null;
try{
FiledirFile=null;
inti=fileVo.getName().lastIndexOf(".");
if(i!=-1){//存在文件类型
fileName1=fileName1+"."+(fileVo.getName()).substring(i+1);
}
booleanbFile=false;
StringmkdirName=path+File.separatorChar+title;
dirFile=newFile(mkdirName);
if(!dirFile.exists()){
dirFile.getParentFile().mkdirs();
}
if(dirFile.isDirectory()){
path=mkdirName+File.separatorChar+fileName1;
}else{
bFile=dirFile.mkdirs();
}
if(bFile){
path=mkdirName+File.separatorChar+fileName1;
}
fileOutputStream=newFileOutputStream(path.replace("*",""));
StringfileName=URLEncoder.encode(fileName1,"UTF-8");
if(fileName.length()>110){
fileName=newString(fileName1.getBytes("gb2312"),"ISO8859-1");
}
response.setHeader("Connection","close");
response.setHeader("Content-Type","application/octet-stream");
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachment;filename=\""
+Utf8Util.toUtf8String(fileName)+"\"");
//读取文件流输出到到另一个位置
fileVo.getFileIo(fileOutputStream);
fileOutputStream.close();
}catch(Exceptione){
logger.error("异常:原因如下"+e.getMessage(),e);
}finally{
try{
if(fileOutputStream!=null){
fileOutputStream.close();
}
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
logger.error("异常:原因如下"+e1.getMessage(),e1);
}
}
}
------

(4)压缩完成,关闭输出流。

util.entdZip(FilePath.getPath());
原文来自:https://www.py.cn
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容