private OutputStream res;
private ZipOutputStream zos;
// action的主方法
public String execute() throws Exception {
if (有数据可下载) {;
// 预处理
preProcess();
} else {
// 没有文件可下载的场合,返回nodata,设定参照struts配置文件
return "nodata";
}
// 在这里编辑好需要下载的数据
风之境地 // 文件可以是硬盘上的
// 文件也可以是自己写得数据流,如果是自己写得数据流,请参看outputZipFile方法中的【2.】
File file = new File();
file = ...
outputZipFile(file);
// 后处理
afterProcess();
return null;
}
// 预处理
public void preProcess() throws Exception {
HttpServletResponse response = ServletActionContext.getResponse();
res = response.getOutputStream();
//清空输出流
response.reset();
//设定输出文件头
response.setHeader("Content-disposition ","attachment; filename=a.zip ");
response.setContentType("application/zip");
zos = new ZipOutputStream(res);
}
// 后处理
public void afterProcess() throws Exception {
zos.close();
res.close();
}
// 写文件到客户端
private void outputZipFile(File file) throws IOException, FileNotFoundException {
ZipEntry ze = null;
byte[] buf = new byte[1024];
int readLen = 0;
// 1.动态压缩一个File到zip中
// 创建一个ZipEntry,并设置Name和其它的一些属性
// 压缩包中的路径和文件名称
ze = new ZipEntry("1\\1\\" + file.getName());
ze.setSize(file.length());
ze.setTime(file.lastModified());
// 将ZipEntry加到zos中,再写入实际的文件内容
zos.putNextEntry(ze);
InputStream is = new BufferedInputStream(new FileInputStream(file));
// 把数据写入到客户端
while ((readLen = is.read(buf, 0, 1024)) != -1) {
zos.write(buf, 0, readLen);
}
is.close();
// 2.动态压缩一个String到zip中
String customFile = "This is a text file.";
// 压缩包中的路径和文件名称
ZipEntry cze = new ZipEntry(“1\\1\\” + "Test.txt");
zos.putNextEntry(cze);
// 利用ByteArrayInputStream把流数据写入到客户端
is = new ByteArrayInputStream(customFile.getBytes());
while ((readLen = is.read(buf, 0, 1024)) != -1) {
zos.write(buf, 0, readLen);
}
}