Java实现多文件边压缩边下载

@ResponseBody
@RequestMapping(value = "/downloadFile", method = RequestMethod.POST)
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
	
	String filePath = request.getParameter("fileName").replace("\\", "/");
	
	String path = filePath.substring(0,filePath.lastIndexOf("/")+1);
	String[] fileNames = filePath.substring(filePath.lastIndexOf("/")+1).split(",");
	
	//响应头的设置
	response.reset();
	response.setCharacterEncoding("utf-8");
	response.setContentType("multipart/form-data");
	
	//设置压缩包的名字
	//解决不同浏览器压缩包名字含有中文时乱码的问题
	//附件名称
	String downloadName = "附件.zip";
	String agent = request.getHeader("USER-AGENT");   
	try {
		if (agent.contains("MSIE")||agent.contains("Trident")) {
			downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
		} else {
			downloadName = new String(downloadName.getBytes("UTF-8"),"ISO-8859-1");
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\"");
	
	//设置压缩流:直接写入response,实现边压缩边下载
	ZipOutputStream zipos = null;
	try {
		zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
		zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法 
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	//循环将文件写入压缩流
	DataOutputStream os = null;
	//文件个数
	for(int i = 0; i < fileNames.length; i++ ){
		filePath = path + fileNames[i];
		//要下载的某个文件的路径
		File file = new File(filePath);
		try {
			//添加ZipEntry,并ZipEntry中写入文件流
			//这里,加上i是防止要下载的文件有重名的导致下载失败
			//文件名字
			zipos.putNextEntry(new ZipEntry(fileNames[i]));
			os = new DataOutputStream(zipos);
			InputStream is = new FileInputStream(file);
			byte[] b = new byte[100];
			int length = 0;
			while((length = is.read(b))!= -1){
				os.write(b, 0, length);
			}
			is.close();
			zipos.closeEntry();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
	
	//关闭流
	try {
		os.flush();
		os.close();
		zipos.close();
	} catch (IOException e) {
		e.printStackTrace();
	}   
}
原文地址:https://www.cnblogs.com/sunBinary/p/11858503.html