1、项目需求:将多个文件打包后,放到本地,提供下载的需求。
2、实现思路:使用org.apache.tools.zip.ZipOutputStream。
3、实现代码:
(1)做一个压缩的工具类
package com.thinkgem.jeesite.modules.data.utils;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipCompressor {
static final int BUFFER = 8192;
private File zipFile;
public ZipCompressor(String pathName) {
zipFile = new File(pathName);
}
public void compress(String... pathName) {
ZipOutputStream out = null;
try {
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
new CRC32());
out = new ZipOutputStream(cos);
String basedir = "";
for (int i=0;i
}
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void compress(String srcPathName) {
File file = new File(srcPathName);
if (!file.exists())
throw new RuntimeException(srcPathName + "不存在!");
try {
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compress(file, out, basedir);
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void compress(File file, ZipOutputStream out, String basedir) {
/* 判断是目录还是文件 */
if (file.isDirectory()) {
System.out.println("压缩:" + basedir + file.getName());
this.compressDirectory(file, out, basedir);
} else {
System.out.println("压缩:" + basedir + file.getName());
this.compressFile(file, out, basedir);
}
}
/** 压缩一个目录 */
private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
/* 递归 */
compress(files[i], out, basedir + dir.getName() + "/");
}
}
/** 压缩一个文件 */
private void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
ZipCompressor zc = new ZipCompressor("E:/resource/resource.zip");
zc.compress("E:/resource/js","E:/resource/css","E:/resource/images");
}
}
(2)调用该类
//存放Zip文件的路径
String path = fileRoot + productService.getCode() + productService.getTypeCode() + ".zip";
File file = new File(path);
if(!file.exists()) {//需要打包的多个文件的路径
String[] str = (String[])strArray.toArray(new String[strArray.size()]);
ZipCompressor zc = new ZipCompressor(path);
zc.compress(str);
}
(3)提供下载的方法
@RequestMapping(value = "downLoadZipFile")
public void estampDown(HttpServletRequest request, HttpServletResponse response) {
try {
String code = request.getParameter("code");
String typeCode = request.getParameter("typeCode");
String fileRoot = Global.getConfig("fileRoot");
String path = fileRoot + code + typeCode + ".zip";
File file = new File(path); // 要下载的文件绝对路径
InputStream ins;
ins = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[ins.available()];
ins.read(buffer);
ins.close();
response.reset();
response.addHeader("Content-Disposition", "attachment;filename="+ new String(file.getName().getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream ous = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
ous.write(buffer);
ous.flush();
ous.close();
} catch (Exception e) {
e.printStackTrace();
}
}
相关资料的链接(感谢):
https://blog.csdn.net/xinqiku/article/details/79656829
http://blog.163.com/shanqing_shuixiu@yeah/blog/static/165319229201192444434865/