实现代码:
// 定义文件根路径:TOMCAT的temp路径 + 时间戳
String dirName = System.getProperty("java.io.tmpdir") + System.currentTimeMillis();
String fileName = "XXX.zip";
response.setContentType("application/zip");
response.setCharacterEncoding("UTF-8");
String dfileName = null;
dfileName = new String(fileName.getBytes("GB2312"), "ISO_8859_1");
response.setHeader("Content-disposition", "attachment;filename=" + dfileName);
OutputStream ouputStream = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(ouputStream);
zos.setEncoding("gbk");// 解决中文乱码问题,不加这句会莫名其妙多一个乱码空文件夹
CZipUtil.zip(zos, "", dirName);
zos.flush();
zos.close();
ouputStream.flush();
ouputStream.close();
压缩工具类:
package huihai.sims.common.util;
import huihai.sims.common.util.CCommon;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* 压缩/解压缩zip包处理类,解压过程存在中文乱码问题
*/
public class CZipUtil {
/**
* 压缩
* @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名
* @param relativePath 相对路径,默认为空
* @param directory 文件或目录的绝对路径
* @throws FileNotFoundException
* @throws IOException
*/
public static void zip(String zipFileName, String relativePath, String directory) throws FileNotFoundException, IOException {
String fileName = zipFileName;
if (fileName == null || fileName.trim().equals("")) {
File temp = new File(directory);
if (temp.isDirectory()) {
fileName = directory + ".zip";
} else {
if (directory.indexOf(".") > 0) {
fileName = directory.substring(0, directory
.lastIndexOf("."))
+ "zip";
} else {
fileName = directory + ".zip";
}
}
}
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream(fileName));
try {
zip(zos, relativePath, directory);
} catch (IOException ex) {
throw ex;
} finally {
if (null != zos) {
zos.close();
}
}
}
/**
* 压缩
* @param zos 压缩输出流
* @param relativePath 相对路径
* @param absolutPath 文件或文件夹绝对路径
* @throws IOException
*/
public static void zip(ZipOutputStream zos, String relativePath, String absolutPath) throws IOException {
File file = new File(absolutPath);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
File tempFile = files[i];
if (tempFile.isDirectory()) {
String newRelativePath = relativePath + tempFile.getName()
+ File.separator;
createZipNode(zos, newRelativePath);
zip(zos, newRelativePath, tempFile.getPath());
} else {
zipFile(zos, tempFile, relativePath);
}
}
} else {
zipFile(zos, file, relativePath);
}
}
/**
* 压缩文件
* @param zos 压缩输出流
* @param file 文件对象
* @param relativePath 相对路径
* @throws IOException
*/
private static void zipFile(ZipOutputStream zos, File file, String relativePath) throws IOException {
ZipEntry entry = new ZipEntry(relativePath + file.getName());
zos.putNextEntry(entry);
InputStream is = null;
try {
is = new FileInputStream(file);
int BUFFERSIZE = 2 << 10;
int length = 0;
byte[] buffer = new byte[BUFFERSIZE];
while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0) {
zos.write(buffer, 0, length);
}
zos.flush();
zos.closeEntry();
} catch (IOException ex) {
throw ex;
} finally {
if (null != is) {
is.close();
}
}
}
/**
* 创建目录
* @param zos zip输出流
* @param relativePath 相对路径
* @throws IOException
*/
private static void createZipNode(ZipOutputStream zos, String relativePath) throws IOException {
ZipEntry zipEntry = new ZipEntry(relativePath);
zos.putNextEntry(zipEntry);
zos.closeEntry();
}
/**
* 解压缩ZIP包
* @param zipFilePath zip文件路径
* @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到ZIP包所在目录下与ZIP包同名的文件夹下
* @throws IOException
*/
public static void unzip(String zipFilePath, String targetPath) throws IOException {
ZipFile zipFile = null;
OutputStream os = null;
InputStream is = null;
String dirPath;
try {
zipFile = new ZipFile(zipFilePath);
if (CCommon.isNullOrEmpty(targetPath)) {
dirPath = zipFilePath.substring(0, zipFilePath.lastIndexOf("."));
} else {
dirPath = CCommon.getDirectory(targetPath);
}
Enumeration<?> entries = zipFile.getEntries();
if (entries != null) {
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
String filePath = dirPath + File.separator + entry.getName();
if (entry.isDirectory()) {
CCommon.createFile(filePath, true);
} else {
File targetFile = CCommon.createFile(filePath, false);
os = new BufferedOutputStream(new FileOutputStream(targetFile));
if (entry.getSize() > 0) {
is = zipFile.getInputStream(entry);
byte[] buffer = new byte[4096];
int readLen = 0;
while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
os.write(buffer, 0, readLen);
}
is.close(); is = null;
os.flush();
}
os.close(); os = null;
}
}
}
} catch (IOException ex) {
throw ex;
} finally {
if (is != null) is.close();
if (os != null) os.close();
if (zipFile != null) zipFile.close();
}
}
}