话不多说,直接上代码
方法需要传入文件目录,比如想打包1目录下的2目录,同时2目录包含3和4目录,name就传入1目录就可以了
打包之后
/**
* 文件打包下载
*
* @param src 需要打包的文件夹的路径,如:/目录1/目录2/3333/
*/
public void downloadZip(String src, HttpServletResponse response) throws Exception {
//压缩文件夹内容
byte[] data = zipUtils.download(src);
//设置响应信息
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=" + DateUtils.dateTimeDetails() + ".zip");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
IOUtils.write(data, response.getOutputStream());
}
//用到的工具类
DateUtils.dateTimeDetails()
/**
* 日期路径 即年/月/日 如201808082008
*/
public static String dateTimeDetails() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMddHHmmss");
}
zpiutils是自动注入的
zipUtils.download(src)
package com.base.minio.utils;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Component;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @ClassName: ZipUtils
* @Author: base
* @Date: 2021/4/15 3:42 下午
* @Version: 1.0
* @Description: zip压缩工具类
*/
@Component
public class ZipUtils {
private static final int BUFFER_SIZE = 2 * 1024;
/**
* 将目录打包压缩成zip
* @param src 需要打包的文件夹的路径,如:/目录1/目录2/3333/
*/
public byte[] download(String src) throws Exception {
//字节输出流,用于下载文件
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//生成zip文件
ZipOutputStream zip = new ZipOutputStream(outputStream);
File sourceFile = new File(src);
//将目录下的文件进行压缩
compress(sourceFile,zip,sourceFile.getName(),true);
IOUtils.closeQuietly(zip);
return outputStream.toByteArray();
}
/**
* 递归压缩方法
* @param sourceFile 源文件
* @param zos zip输出流
* @param name 压缩后的名称
* @param keepDirStructure 是否保留原来的目录结构,true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
*/
public void compress(File sourceFile, ZipOutputStream zos, String name,
boolean keepDirStructure) throws Exception{
byte[] buf = new byte[BUFFER_SIZE];
if(sourceFile.isFile()){
// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
zos.putNextEntry(new ZipEntry(name));
// copy文件到zip输出流中
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1){
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if(listFiles == null || listFiles.length == 0){
// 需要保留原来的文件结构时,需要对空文件夹进行处理
if(keepDirStructure){
// 空文件夹的处理
zos.putNextEntry(new ZipEntry(name + "/"));
// 没有文件,不需要文件的copy
zos.closeEntry();
}
}else {
for (File file : listFiles) {
// 判断是否需要保留原来的文件结构
if (keepDirStructure) {
// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
compress(file, zos, name + "/" + file.getName(),keepDirStructure);
} else {
compress(file, zos, file.getName(),keepDirStructure);
}
}
}
}
}
}