struts2 动态压缩成zip文件下载(不生成临时文件)

功能:文件下载
简述:
1.根据画面上的复选框进行文件打包下载
2.待下载文件保存在服务器的硬盘上,打包过程中不生成临时文件
3.打包过程中需要动态创建一个txt文件一并打进zip包中
4.页面上没有文件被选择的场合,按下【下载】按钮后,什么都不做(不刷新页面)

部分内容参考自互联网,如果错误,欢迎指正。

Struts配置文件
<!-- 数据下载Action -->
<action name="downZip" class="DownloadAction">
	<result name="nodata" type="httpheader">
		<param name="status">204</param>
	</result>
</action>


Action代码
	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);
		}
		
	}


你可能感兴趣的:(struts2,zip,下载文件,动态打包,不刷新)