struts2下載文件功能(邊下載邊打包)

多個文件,目錄不同,通過條件查詢如何進行打包下載呢?

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;
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章