多个文件夹(文件夹中有相应的文件)打包压缩到指定目录,并可以下载功能。
1. 先创建出项目编号文件夹
String pDocPath = “XXX” //根据需求,自行设置文件夹创建到哪里
File pnFile = new File(pDocPath);
if (!pnFile.exists()) {
pnFile.mkdirs();
}
2.将需要的本地文件复制到文件夹中
// 源文件地址
String oldPath = “XXX”
// 复制到目标的地址
String newPath = "XXX";
File oldfile = new File(oldPath);
if (oldfile.exists()) { // 文件存在时
try (InputStream inStream = new FileInputStream(oldPath); // 读入原文件
FileOutputStream fs = new FileOutputStream(newPath)) {
byte[] buffer = new byte[1024 * 2];
// int length;
while ((byteread = inStream.read(buffer)) != -1) {
fs.write(buffer, 0, byteread);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("复制单个文件操作出错");
} catch (IOException e) {
e.printStackTrace();
System.out.println("复制单个文件操作出错");
}
}
3.开始压缩
// 最后获取路径进行压缩
String zipPath = null;
// 设定文件压缩后放到哪里
zipPath = “XXX”+ ".zip";
try (FileOutputStream fos1 = new FileOutputStream(new File(zipPath)); ZipOutputStream zos = new ZipOutputStream(fos1)) {
// 源文件(被压缩的文件)
File sourceFile = new File(pDocPath);
etmfPType1Service.compress(sourceFile, zos, sourceFile.getName(), true);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 压缩完成,开始下载
// 下载地址
String uploadPath = zipPath;
response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;fileName=" + projectNo + ".zip");
byte[] buffer = new byte[1024];
try (FileInputStream fis = new FileInputStream(uploadPath);
BufferedInputStream bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream()) {
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
}
3.1 compress方法
在3.0中service调用了compress方法,方法内容在这里。
/**
*
* @param sourceFile 源文件
* @param zos zip输出流
* @param name 压缩后的名称
* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
* @throws Exception
*/
public void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws Exception {
byte[] buf = new byte[1024];
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);
}
// Complete the entry
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);
}
}
}
}
}