Spring MVC文件下载
文件下载有以下两种实现方法:
通过超链接实现下载:实现简单,但暴露了下载文件的真实位置,并且只能下载 Web 应用程序所在目录下的文件,WEB-INF 目录除外。 利用程序编码实现下载:增强安全访问控制,可以下载除 Web 应用程序所在目录以外的文件,也可以将文件保存到数据库中。
利用程序编码实现下载需要设置以下两个报头:
Web 服务器需要告诉浏览器其所输出内容的类型不是普通文本文件或 HTML 文件,而是一个要保存到本地的下载文件,这需要设置 Content-Type 的值为 application/x-msdownload。 Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。
该报头指定了接收程序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。
设置报头的示例如下:
response.setHeader( Content-Type , application/x-msdownload
response.setHeader( Content-Disposition , attachment;filename= +filename);
程序编码文件下载可分为两个步骤:
下面继续通过 springMVCDemo2 应用讲述利用程序实现下载的过程,要求从《Spring MVC文件上传》上传文件的目录(workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/springMVCDemo2/uploadfiles)中下载文件,具体开发步骤如下。
1. 编写控制器类首先编写控制器类 FileDownController,在该类中有 3 个方法,即 show、down 和 toUTF8String。其中,show 方法获取被下载的文件名称;down 方法执行下载功能;toUTF8String 方法是下载保存时中文文件名的字符编码转换方法。
FileDownController 类的代码如下:
package controller; import java.io.File; import java.io.FileInputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class FileDownController { // 得到一个用来记录日志的对象,在打印时标记打印的是哪个类的信息 private static final Log logger = LogFactory .getLog(FileDownController.class); * 显示要下载的文件 @RequestMapping( showDownFiles ) public String show(HttpServletRequest request, Model model) { // 从 workspace/.metadata/.plugins/org.eclipse.wst.server.core/ // tmp0/wtpwebapps/springMVCDemo11/下载 String realpath = request.getServletContext() .getRealPath( uploadfiles File dir = new File(realpath); File files[] = dir.listFiles(); // 获取该目录下的所有文件名 ArrayList String fileName = new ArrayList String for (int i = 0; i files.length; i++) { fileName.add(files[i].getName()); model.addAttribute( files , fileName); return showDownFiles * 执行下载 @RequestMapping( down ) public String down(@RequestParam String filename, HttpServletRequest request, HttpServletResponse response) { String aFilePath = null; // 要下载的文件路径 FileInputStream in = null; // 输入流 ServletOutputStream out = null; // 输出流 try { // 从workspace/.metadata/.plugins/org.eclipse.wst.server.core/ // tmp0/wtpwebapps下载 aFilePath = request.getServletContext().getRealPath( uploadfiles // 设置下载文件使用的报头 response.setHeader( Content-Type , application/x-msdownload response.setHeader( Content-Disposition , attachment; filename= + toUTF8String(filename)); // 读入文件 in = new FileInputStream(aFilePath + // + filename); // 得到响应对象的输出流,用于向客户端输出二进制数据 out = response.getOutputStream(); out.flush(); int aRead = 0; byte b[] = new byte[1024]; while ((aRead = in.read(b)) != -1 in != null) { out.write(b, 0, aRead); out.flush(); in.close(); out.close(); } catch (Throwable e) { e.printStackTrace(); logger.info( 下载成功 return null; * 下载保存时中文文件名的字符编码转换方法 public String toUTF8String(String str) { StringBuffer sb = new StringBuffer(); int len = str.length(); for (int i = 0; i len; i++) { // 取出字符中的每个字符 char c = str.charAt(i); // Unicode码值为0~255时,不做处理 if (c = 0 c = 255) { sb.append(c); } else { // 转换 UTF-8 编码 byte b[]; try { b = Character.toString(c).getBytes( UTF-8 } catch (UnsupportedEncodingException e) { e.printStackTrace(); b = null; // 转换为%HH的字符串形式 for (int j = 0; j b.length; j++) { int k = b[j]; if (k 0) { k = 255; sb.append( % + Integer.toHexString(k).toUpperCase()); return sb.toString(); }2. 创建文件列表页面
下载文件示例需要一个显示被下载文件的 JSP 页面 showDownFiles.jsp,代码如下:
%@ page language= java contentType= text/html; charset=UTF-8 pageEncoding= UTF-8 % %@ taglib uri= http://java.sun.com/jsp/jstl/core prefix= c % head meta http-equiv= Content-Type content= text/html; charset=UTF-8 title Insert title here /title /head body table td 被下载的文件名 /td /tr !--遍历 model中的 files-- c:forEach items= ${files} var= filename a href= ${pageContext.request.contextPath }/down?filename=${filename} ${filename} /a /td /tr /c:forEach /table /body /html3. 测试下载功能
访问地址:http://localhost:8080/springmvcDemo2/showDownFiles,运行结果如下。
![showDownFiles.jsp页面](http://ytso-blog-oss-img.oss-cn-beijing.aliyuncs.com/wp-content/uploads/2021/07/16/20210716_60f1a1696af94.png)
下载文件列表页面 单击上图中的超链接即可下载文件。
4615.html
springSpring CloudSpring DataSpring frameworkSpring SecuritySpringBootSpringMVC相关文章
- Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
- spring boot自动配置原理面试题_Spring boot面试
- 面试突击80:说一下 Spring 中 Bean 的生命周期?
- 简单介绍一下spring bean的生命周期_Spring bean的生命周期
- Spring MVC各组件近距离接触--上--02
- Spring MVC更多家族成员--主题(Theme)与ThemeResolver
- Quartz SchedulerFactoryBean异常–Spring自动装配惹的祸
- 基于Spring MVC + Spring + MyBatis的【超市会员管理系统】
- Spring 5(四)JdbcTemplate
- java 长轮询_java – Spring中的长轮询[通俗易懂]
- rabbitMQ结合spring-boot使用(3)
- Spring AOP 笔记 简单易解
- Spring Boot 实现万能文件在线预览,已开源,真香!!
- spring boot 下载excel文件提示“文件中部分内容有问题。是否让我们尽量尝试恢复
- Spring Cloud Task 任务开发-定义任务输入和输出(一)
- 使用docker发布spring cloud应用详解架构师
- Spring Cloud Feign的文件上传实现详解编程语言
- Spring错误:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.B详解编程语言
- spring的AOP(五)—-Spring AOP 编程(AspectJ )详解编程语言
- 开发者眼中的Spring与Java EE详解编程语言
- Spring Boot核心配置详解编程语言
- Spring Boot Debug调试详解编程语言
- Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控详解编程语言
- 基于properties文件的Spring Boot多环境切换详解编程语言
- spring boot集成mybatis 自动生成实体类和mapper文件、Dao层详解编程语言
- Spring框架下整合Redis的实现(spring整合redis)
- Spring Boot 2.x :通过 spring-boot-starter-hbase 集成 HBase
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)