zip压缩下载不仅可以减少网络传输,而且可以实现批量的文件下载。最近在项目中用到,写了个工具类,如下
/* * @{#} ZipUtils.java Create on Jan 18, 2010 2:45:47 PM * Copyright (c) 2009 by Huashui. */ package com.peaksport.export.zip; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** *@author huashui *@blog http://huashui.org *使用方法,传递response和要打包的文件即可。 */ public class ZipHandler { private HttpServletRequest request; private HttpServletResponse response; private List<File> fileList = new ArrayList<File>(); public ZipHandler(HttpServletResponse response, List<File> fileList) { super(); this.response = response; this.fileList = fileList; } public ZipHandler() { super(); } public void createZip(String filename) throws IOException { response.setHeader("Content-disposition", "attachment; filename=" + filename); response .setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0,private, max-age=0"); response.setHeader("Content-Type", "application/octet-stream"); response.setHeader("Content-Type", "application/force-download"); response.setHeader("Pragma", "public"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); byte[] buffer = new byte[1024]; ZipOutputStream out = new ZipOutputStream(response.getOutputStream()); //需要同时下载的文件,以一个list传递进来 for (File tempfile : fileList) { FileInputStream fis = new FileInputStream(tempfile); out.putNextEntry(new ZipEntry(tempfile.getName())); int len; while ((len = fis.read(buffer)) > 0) { out.write(buffer, 0, len); } out.closeEntry(); fis.close(); } out.flush(); out.close(); } public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } public List<File> getFileList() { return fileList; } public void setFileList(List<File> fileList) { this.fileList = fileList; } }