`
wdmcygah
  • 浏览: 62432 次
社区版块
存档分类
最新评论

SpringMVC下打包文件的下载

阅读更多

在实际应用中,文件下载或导出报表的场景应该很常见,如Excel报表导出……如果文件较多时,用户往往希望文件能够打包进行下载,这个时候就需要对下载的文件进行压缩打包,再进行下载。针对这个场景,我写了个压缩文件打包下载的Demo,这里实现的是Excel文件的压缩下载,Excel生成用到了Apache的POI组件,压缩功能使用的JDK自带API,具体实现代码如下:

一、Controller类

/**
 * 压缩包下载控制器
 * @author wdmcygah
 *
 */
@Controller
@RequestMapping("/zip")
public class ZipController {

	/**
	 * 压缩文件下载处理
	 */
	@RequestMapping("/download")
	public ModelAndView downloanExcel(){
		List<UserInfo> list = new ArrayList<UserInfo>();
		UserInfo userInfo = new UserInfo();
		userInfo.setPassword("0000");
		userInfo.setUserName("sdfas");
		list.add(userInfo);
		list.add(userInfo);
		list.add(userInfo);
		list.add(userInfo);
		Map<String,List<UserInfo>> map = new HashMap<String, List<UserInfo>>();
		map.put("infoList", list);
		ZipView ve = new ZipView();
		return new ModelAndView(ve,map);
	}
	
}

 

二、View类

/**
 * 下载Excel视图
 * 
 * @author wdmcygah
 *
 */
public class ZipView extends AbstractView {

	@Override
	protected void renderMergedOutputModel(Map<String, Object> model,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		HSSFWorkbook b1 = generateExcel(model);
		HSSFWorkbook b2 = generateExcel(model);
		File file = getFile();
		ZipUtils.zip(getFile(), b1,b2);
		response.setContentType("application/octet-stream");
                //这里为避免下载时中文乱码,需要进行url编码
		String name = URLEncoder.encode("压缩.zip", "UTF-8");
		response.setHeader("Content-disposition", "attachment;filename="
				+ name);
		OutputStream os = response.getOutputStream();
		IOUtils.copy(new FileInputStream(file), os);
		os.flush();
		os.close();
		file.delete();
	}
	
	private HSSFWorkbook generateExcel( Map<String,Object> model){
		HSSFWorkbook result = null;
		@SuppressWarnings("unchecked")
		List<UserInfo> list = (List<UserInfo>) model.get("infoList");
		if (list != null && list.size() != 0) {
			result = new HSSFWorkbook();
			int len = list.size();
			Sheet sheet = result.createSheet();
			// 第一行文字说明
			Row row = sheet.createRow(0);
			Cell cell = row.createCell(0, Cell.CELL_TYPE_STRING);
			cell.setCellValue("用户名");
			cell = row.createCell(1, Cell.CELL_TYPE_STRING);
			cell.setCellValue("密码");

			//下面是具体内容
			for (int i = 0; i < len; i++) {
				row = sheet.createRow(i + 1);
				cell = row.createCell(0, Cell.CELL_TYPE_STRING);
				cell.setCellValue(list.get(i).getUserName());
				cell = row.createCell(1, Cell.CELL_TYPE_STRING);
				cell.setCellValue(list.get(i).getPassword());
			}
		}
		return result;
	}

	private File getFile(){
		String targetPath = "/ziptarget/zip/";
		File file = new File(targetPath);
		if( !file.exists() ){
			file.mkdirs();
		}
		String fileName = "test.zip";
		File f = new File(targetPath+fileName);
		if( !f.exists() ){
			try {
				File.createTempFile("001", ".zip");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return f;
	}
	
}

 

三、压缩工具类

/**
 * 使用JDK自带的Zip处理类进行文件的压缩与解压
 *
 */
public class ZipUtils {

	/**
	 * 对Excel文件进行压缩
	 * 
	 * @param wb
	 */
	public static void zip(File targetFile, HSSFWorkbook... wbs) {
		if (wbs == null || wbs.length == 0) {
			return;
		}
		ZipOutputStream zos = null;
		try {
			zos = new ZipOutputStream(new FileOutputStream(targetFile));
			for (int i = 0; i < wbs.length; i++) {
				ZipEntry entry = new ZipEntry("文件" + i + ".xls");
				// 设置压缩包的入口
				zos.putNextEntry(entry);
				wbs[i].write(zos);
				zos.flush();
			}
			zos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

四、测试页面

<html>
<head>        
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head>
<body>
<h3>测试下载Excel功能</h3>
<form action="file/download.htm" enctype="multipart/form-data" method="post">
	<input type="submit" value="下载Excel"></input>	
</form>

<h3>测试上传Excel功能</h3>
<form action="file/upload.htm" enctype="multipart/form-data" method="post">
	<input type="file" name="file"></input>
	<input type="submit" value="上传Excel"></input>	
</form>

<h3>测试Excel的打包下载功能</h3>
<form action="zip/download.htm" enctype="multipart/form-data" method="post">
	<input type="submit" value="下载Excel打包文件"></input>	
</form>
</body>
</html>

 


完整源码可见我的Github地址:https://github.com/wdmcygah/research-spring
代码在Chrome浏览器下测试通过。

 

 

1
0
分享到:
评论
2 楼 wdmcygah 2014-12-31  
wushao 写道
建议实现HandlerMethodReturnValueHandler接口,写个专门负责下载的类

@wushao HandlerMethodReturnValueHandler这个接口到是用得少,感谢拓宽了思路。我查看了下spring的源码,HandlerMethodReturnValueHandler这个接口主要是处理handler返回的Model对象的,调用时机应该是handler处理的结尾时。我的原来的思路是在view解析的时候做处理,感觉两种方式只是时机有所不同,暂未发现实现接口的优势?
1 楼 wushao 2014-12-30  
建议实现HandlerMethodReturnValueHandler接口,写个专门负责下载的类

相关推荐

    SpringMVC demo 完整源码实例下载

    SpringMVC提供了便捷的文件上传支持,通过`@RequestParam("file") MultipartFile file`注解接收文件,并且可以处理文件的保存和下载操作。这涉及到文件流的读写以及文件存储策略。 异常处理是任何应用程序都需要...

    springmvc maven工程

    1. **依赖管理**: 自动下载并管理项目所需的库文件。 2. **构建工具**: 支持编译、测试、打包、部署等一系列构建过程。 3. **标准化**: 通过约定优于配置的原则,简化项目配置。 4. **插件丰富**: 提供大量插件,...

    SpringMVC 多版本接口/IP访问控制/ANT打包发布到LINUX

    本教程将探讨如何在SpringMVC中实现多版本接口管理、IP访问控制以及使用ANT工具进行打包并部署到Linux服务器。 首先,让我们深入理解**多版本接口**的实现。在API开发中,随着项目的迭代,可能会出现新旧接口共存的...

    spring+springMVC全量jar包

    在使用"spring+springMVC全量jar包"时,开发者可以得到完整的Spring和SpringMVC框架,包括所有必需的依赖,这样无需单独下载和管理每个库,可以快速搭建项目环境。不过,现在更多的开发实践中,推荐使用构建工具如...

    Spring+SpringMVC+Mybatis框架项目整合

    8. **部署与测试**:将项目打包成WAR文件,部署到Tomcat服务器上,通过浏览器访问测试接口,验证整个系统是否能够正常运行。 以上就是"Spring+SpringMVC+Mybatis框架项目整合"的关键知识点,整合这三大框架可以使...

    基于Eclipse构建Maven的SpringMVC项目技术文档

    ### 基于Eclipse构建Maven的SpringMVC项目技术文档 #### 一、引言 在现代软件开发过程中,Maven作为一种自动化构建工具,因其便捷性与灵活性被广泛应用于Java项目的构建与管理中。SpringMVC作为Spring框架的一个...

    springMVC简单登陆例子

    - 配置SpringMVC的Servlet上下文配置文件(如`servlet-context.xml`),声明HandlerMapping和HandlerAdapter,以及视图解析器等。 2. **创建Controller** - 编写一个Controller类,比如`LoginController`,并使用...

    jQuery.filer拖拽、批量上传优化 自动识别单文件下载、多文件自动打包下载SpringMvc后台完整案例

    jsp、jquery、jQuery.filer+后台JAVA SpringMcv 实现推拽,批量上传功能。 1、实现数据报表展示 2、新增,编辑,图片删除(物理删除) ...4、优化上传图片时动态传递参数,...8、自动识别单文件下载、多文件自动打包下载

    springmvc api chm 文档

    CHM 文件是微软开发的一种帮助文件格式,它将一系列 HTML 页面打包成一个文件,内含索引和搜索功能。Spring MVC 3.0 引入了许多新特性,如支持注解驱动的控制器、支持异步处理、支持数据绑定和验证等。开发者可以...

    SpringMVC+Maven DEMO

    它通过一个配置文件(pom.xml)来定义项目的信息、构建过程和依赖关系,帮助开发者自动下载所需的库文件,编译源代码,运行测试,以及打包和部署应用程序。 **SpringMVC核心组件** 1. **DispatcherServlet**:前端...

    Maven模块项目。整合spring+springmvc+mybatis

    而"打包web项目.docx"则可能详细介绍了如何使用Maven的war插件进行项目打包,生成可供服务器部署的WAR文件。 "Maven模块项目"这个压缩包中还包含了一个整合说明,这将指导开发者如何配置Spring、SpringMVC和MyBatis...

    Maven搭建的SpringMVC框架

    在SpringMVC项目中,Maven可以帮助我们下载和管理所需的库,构建并打包项目。 搭建SpringMVC+Mybatis框架的第一步是创建一个新的Maven项目。在IDE如IntelliJ IDEA或Eclipse中,选择"New Project",然后选择"Maven...

    Maven springMVC项目实例

    2. **依赖管理**:通过在`pom.xml`文件中声明依赖,Maven可以自动下载并管理项目所需的所有库,避免了版本冲突的问题。 3. **构建工具**:Maven通过`mvn clean`, `mvn compile`, `mvn test`, `mvn package`等命令...

    SpringMVC demo

    项目可以被打包成 WAR 文件,部署到 Tomcat 或其他 Servlet 容器中运行。IDE 如 IntelliJ IDEA 或 Eclipse 提供了便捷的导入和部署选项,使得开发者可以快速地进行开发和调试。 总的来说,"SpringMVC demo"项目展示...

    springmvc+spring+hibernate

    3. **配置Spring**:在src/main/resources下创建applicationContext.xml文件,配置Spring的核心容器,包括Bean定义、数据源、事务管理器等。例如,使用DataSource来连接Oracle数据库,使用...

    maven+springmvc 项目代码

    开发者只需要在POM中声明依赖,Maven会自动下载并管理这些库,避免了手动管理jar包的繁琐工作。 2. **构建流程**:Maven提供了一系列的生命周期阶段,如编译(compile)、测试(test)、打包(package)、验证...

    JavaEclipseMaven,SpringMVC简单demo

    5. **部署与运行**:将项目打包成WAR文件,部署到Tomcat等Web服务器,然后通过浏览器访问应用。 在这个过程中,开发者可能会遇到诸如版本兼容问题、依赖冲突、配置错误等挑战。解决这些问题需要对Java、Eclipse、...

    MAVEN搭建的springmvc项目

    `WEB-INF`目录包含了应用程序的私有资源,如`web.xml`部署描述符,它是SpringMVC的配置文件,用于配置DispatcherServlet、拦截器、视图解析器等。`views`目录通常是存放JSP页面的地方,每个JSP页面对应一个...

    SpringMVC-Helloworld

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的请求-响应...掌握这些基础知识后,可以进一步学习更复杂的应用场景,如表单处理、文件上传下载、异常处理、数据绑定等,从而深入理解SpringMVC的强大功能。

    SpringMVC项目实战教程

    Maven通过pom.xml文件定义项目依赖,自动下载所需库,构建并打包项目。 MyBatis是一个轻量级的持久层框架,它简化了SQL与Java的交互。在SpringMVC项目中,MyBatis可以与Spring集成,通过Mapper接口和XML配置文件,...

Global site tag (gtag.js) - Google Analytics