struts2下载文件功能(边下载边打包)

转: http://cloudyxuq.iteye.com/blog/1532631

多个文件,目录不同,通过条件查询如何进行打包下载呢?

1.利用ZipEntry进i行文件的压缩

2.前台jsp传入需要打包下载的一系列的文件的路径(数组类型)。因为是在checkBox中,表单提交会自动将其定义成数组。只需要将name名称命名成后台需要得到的路径数组名称

比如前台

downLoadZip.jsp

--------checkBox处代码-------------------------------

利用iterator迭代出来的filePath

<input type="checkbox" name="downLoadPaths"
value='<s:property value="filePath"/>'/>








后台Action

private String[] downLoadPaths;

对downLoadPaths进行遍历,打包。。。。

代码:
/**
 * 批量下载(压缩成zip,然后下载)。不创建临时文件
 * 
 * @author Cloudy
 * 
 */
@Namespace("xxxxxx")
public class DownZipAction {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	// 传递一个List<String>()对象传值路径合集
	private String[] downLoadPaths;
	private OutputStream res;
	private ZipOutputStream zos;
	private String outPath;

	// Action主方法
	@Action(value="DownLoadZip",results={@Result(name="nodata",location="/error.jsp"),
			@Result(name="success",location="xxxx.jsp")})
	public String downLoadZip() throws Exception {
		// 有数据可以下载
		if (downLoadPaths.length != 0) {
			// 进行预处理
			preProcess();
		} else {
			// 没有文件可以下载,返回nodata
			return "nodata";
		}
		// 处理
		writeZip(downLoadPaths);
		// 后处理关闭流
		afterProcess();
		return SUCCESS;
	}

	// 压缩处理
	public void writeZip(String[] downLoadPaths) throws IOException {
		byte[] buf = new byte[8192];
		int len;
		
		for (String filename : downLoadPaths) {
			File file = new File(filename);
			if (!file.isFile())
				continue;
			ZipEntry ze = new ZipEntry(file.getName()); //apache jar的ZipEntry
			zos.putNextEntry(ze);
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
			while ((len = bis.read(buf)) > 0) {
				zos.write(buf, 0, len);
			}
			bis.close();
			zos.closeEntry();
		}
	}

	// 预处理
	public void preProcess() throws Exception {
		HttpServletResponse response = ServletActionContext.getResponse();
		res = response.getOutputStream();
		// 清空输出流(在迅雷下载不会出现一长窜)
		response.reset();
		// 设定输出文件头
		response.setHeader("Content-Disposition", "attachment;filename=document.zip");
		response.setContentType("application/zip");
		zos = new ZipOutputStream(res);
	}

	// 后处理
	public void afterProcess() throws IOException {

		zos.close();
		res.close();
	}

	public OutputStream getRes() {
		return res;
	}

	public void setRes(OutputStream res) {
		this.res = res;
	}

	public ZipOutputStream getZos() {
		return zos;
	}

	public void setZos(ZipOutputStream zos) {
		this.zos = zos;
	}

	public String[] getDownLoadPaths() {
		return downLoadPaths;
	}

	public void setDownLoadPaths(String[] downLoadPaths) {
		this.downLoadPaths = downLoadPaths;
	}

	public String getOutPath() {
		return outPath;
	}

	public void setOutPath(String outPath) {
		this.outPath = outPath;
	}

}


struts2文件下载错误提示的解决方法 .
http://blog.csdn.net/java20100406/article/details/6439698

你可能感兴趣的:(struts2)