java压缩文件夹并发送给前端

Controller

ServletOutputStream.getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Controller
@RequestMapping("/FileComponent")
public class FileComponentController extends BaseController {

@Autowired
private HttpServletResponse response;

@Autowired
private zipUtil ziputil;

@RequestMapping(value ="/getZipFile")
@ResponseBody
public void getZipFile() throws Exception{


try {

List<String> fileinfo = new ArrayList<String>();
fileinfo = fileBuild.creatTxtFile("111", "ziptest.txt", "192310");
System.out.println(fileinfo.get(1));
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=excel.zip");
ziputil.toZip(fileinfo.get(1), response.getOutputStream(),false);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
}



}



}

zipUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
@Component
public class zipUtil {
private static final int BUFFER_SIZE = 2 * 1024;

/**
* 压缩成ZIP 方法
* @param srcDir 压缩文件夹路径
* @param out 压缩文件输出流
* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
* @throws RuntimeException 压缩失败会抛出运行时异常
*/
public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException{

long start = System.currentTimeMillis();

ZipOutputStream zos = null ;

try {

zos = new ZipOutputStream(out);
File sourceFile = new File(srcDir);
compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);

} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils",e);
}finally{
if(zos != null){
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}

}

}

}


/**
* 递归压缩方法
* @param sourceFile 源文件
* @param zos zip输出流
* @param name 压缩后的名称
* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
* @throws Exception
*/

private static 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);

}

// 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);

}

}

}

}

}
}

fileUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class fileBuild {

public static List<String> creatTxtFile(String info,String filename , String storecd) throws IOException {

List<String> fileinfo = new ArrayList<String>();
DateFormat df = new SimpleDateFormat("yyyyMMddHHmm");
Calendar calendar = Calendar.getInstance();
String dateName = df.format(calendar.getTime());
String name = storecd+dateName+"/";
//String path = "/src/main/webapp/WEB-INF/"+name;

String textpath = fileBuild.class.getResource("/").getPath()+name;
File filepath = new File(textpath);
filepath.mkdir();
String nowfilepath = (fileBuild.class.getResource("/").getPath()+name+filename);
nowfilepath = nowfilepath.substring(1,nowfilepath.length());
fileinfo.add(filename);
fileinfo.add(textpath);
File file1 = new File(nowfilepath);

if (!file1.exists()) {
file1.createNewFile();

BufferedWriter fileWriter =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file1),"UTF-8"));

//FileWriter fileWriter = new FileWriter(filename);
fileWriter.write(info);
fileWriter.flush();
fileWriter.close();

return fileinfo;

}


return null;

}


}

参考博客
https://blog.csdn.net/csdn_kenneth/article/details/78725607
https://www.cnblogs.com/zeng1994/p/7862288.html