Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart
1、简介
Spring内置的multipart支持会处理web应用中的文件上传。你可以启用该支持 -- 通过可插拔的MultipartResolver对象们,它们都是定义在 org.springframework.web.multipart 包中。Spring提供了一个MultipartResolver实现,配合Commons FileUpload使用,或者配合Servlet 3.0 multipart 请求解析使用。
默认,Spring不会处理multipart,因为一些开发者希望由自己来处理它们。你可以让Spring来处理 -- 通过在web应用的context中添加一个multipart resolver。每个请求都会被检查,以查看其是否包含一个multipart。如果没有,就放行。如果有,在你的上下文中声明的MultipartResolver会被用来处理它。之后,你就可以像对待其他attribute一样来对待在你请求中的multipart attribute。
2、结合Commons FileUpload来使用MultipartResolver
下例示意了如何使用CommonsMultipartResolver:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="100000"/> </bean>
当然,你还要将需要的jars放到你的classpath内,这样才能使其正常工作。在该例中,你需要使用 commons-fileupload.jar 。
当Spring DispatcherServlet 探测到一个multi-part请求时,它会激活已声明的resolver,并将请求交给它。该resolver会将当前的HttpServletRequest封装进一个MultipartHttpServletRequest,后者支持multipart file uploads。通过使用MultipartHttpServletRequest,你可以在controllers中获取包含在该请求中的multiparts的信息,还可以实际访问到这些multipart files。
3、结合Servlet 3.0 来使用MultipartResolver
为了使用基于Servlet 3.0 的multipart解析,你需要给DispatcherServlet标记一个”multipart-config”部分 -- 在xml中,或者,在编码式Servlet注册中标记一个javax.servlet.MultipartConfigElement,或者,在自定义Servlet class情况下,使用javax.servlet.annotation.MultipartConfig注解。 配置设置,例如最大尺寸或者存储位置,需要在该Servlet注册级别上应用,因为Servlet 3.0 不允许这些设置由MultipartResolver来完成!
一旦Servlet 3.0 multipart解析被启用了,你就可以将StandardServletMultipartResolver添加到你的Spring配置中:
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>
4、处理form中的文件上传
首先,创建一个form带有file input,允许用户上传。encoding attribute (enctype=”multipart/form-data”)会告诉浏览器将forms以multipart request形式编码:
<html>
<head>
<title>Upload a file please</title>
</head>
<body>
<h1>Please upload a file</h1>
<form method="post" action="/form" enctype="multipart/form-data">
<input type="text" name="name"/>
<input type="file" name="file"/>
<input type="submit"/>
</form>
</body>
</html>
下一步就是创建一个controller来处理该文件上传。 如下:
@Controller
public class FileUploadController { @PostMapping("/form")
public String handleFormUpload(@RequestParam("name") String name,
@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) {
byte[] bytes = file.getBytes();
// store the bytes somewhere
return "redirect:uploadSuccess";
} return "redirect:uploadFailure";
} }
注意@RequestParam 参数会映射到form中声明的input元素。在该例中,没有涉及byte[],但你仍然可以将其保存到数据库、文件系统等等。
当使用Servlet 3.0 multipart 解析时,你还可以使用javax.servlet.http.Part:
@Controller
public class FileUploadController { @PostMapping("/form")
public String handleFormUpload(@RequestParam("name") String name,
@RequestParam("file") Part file) { InputStream inputStream = file.getInputStream();
// store bytes from uploaded file somewhere return "redirect:uploadSuccess";
} }
5、处理来自编码式客户端的文件上传请求
multipart请求还可以来自非浏览器的客户端 -- 在REST风格式服务场景中。所有上述例子和配置均适用于这种情况。 然而,不同于浏览器,编码式客户端也可以发送特定内容类型的更加复杂的数据 -- 例如,一个multipart请求带有一个文件和JSON格式的数据:
POST /someUrl
Content-Type: multipart/mixed --edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="meta-data"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit {
"name": "value"
}
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="file-data"; filename="file.properties"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
... File Data ...
你可以使用@RequestParam(“meta-data”) String metadata 来访问 "meta-data"部分。然而,你可能倾向于接收一个强类型的对象 -- 由请求中的JSON格式数据初始化而成的,非常类似于@RequestBody使用HttpMessageConverter将一个non-multipart请求的请求体转成目标对象。
此时,你可以使用@RequestPart注解来代替@RequestParam注解。它允许你再来关注一个经过HttpMessageConverter的特定的multipart内容其'Content-Type' header部分。
@PostMapping("/someUrl")
public String onSubmit(@RequestPart("meta-data") MetaData metadata,
        @RequestPart("file-data") MultipartFile file) {
    // ...
}
注意MultipartFile 可以被@RequestParam或@RequestPart任意访问。然而, @RequestPart(“meta-data”) MetaData在这里,是读取其'Content-Type' header部分的JSON内容,并使用MappingJackson2HttpMessageConverter来转换的。
Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持的更多相关文章
- Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC
		
内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...
 - Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图
		
接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...
 - Spring 4 官方文档学习(十一)Web MVC 框架
		
介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...
 - Spring 4 官方文档学习(十二)View技术
		
关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...
 - Spring Boot 官方文档学习(一)入门及使用
		
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
 - Spring boot官方文档学习(一)
		
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
 - Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)
		
接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...
 - Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion
		
本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...
 - Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)
		
题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...
 - Spring 4 官方文档学习(十一)Web MVC 框架之编码式Servlet容器初始化
		
在Servlet 3.0+ 环境中,你可以编码式配置Servlet容器,用来代替或者结合 web.xml文件.下面是注册DispatcherServlet : import org.springfra ...
 
随机推荐
- Jeecg 如何执行批量insert或者update操作,高效率
			
方法:org.jeecgframework.core.common.dao.jdbc.SimpleJdbcTemplate.batchUpdate 原理: 基于springjdbc封装,批量提 ...
 - MongoDB索引原理
			
转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...
 - redis 只允许指定的额内网IP访问,其余的外网IP不允许访问
			
为了redis的安全,现在设定如下规则.只允许指定的服务器通过内网的方式访问.其余一律不准访问 因为redis登录额时候是不需要密码的,很不安全. 所以这里添加如下iptables规则 iptable ...
 - [学习笔记]Spring依赖注入
			
依赖: 典型的企业应用程序不可能由单个对象(在spring中,也可称之bean)组成,再简单的应用也是由几个对象相互配合工作的,这一章主要介绍bean的定义以及bean之间的相互协作. 依赖注入: s ...
 - vim学习日志(5):vim下wimrc的配置,解决中文乱码问题
			
解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: ,ucs-bom,gb18030,gbk,gb231 ...
 - 基于python的接口测试框架设计(一)连接数据库
			
基于python的接口测试框架设计(一)连接数据库 首先是连接数据库的操作,最好是单独写在一个模块里, 然后便于方便的调用,基于把connection连接放在__init__()方法里 然后分别定义D ...
 - ucos-III前言
			
年 uC/OS-III实时操作系统面世以来,uC/OS-III的性能和稳定性已经日趋完善.uC/OS-III对前面版本取精弃粕,推陈出新,功能和性能比起 uC/OS-II已经上了很大一步台阶.uC/O ...
 - poj2018(高精度二分+dp)
			
题意:给你n个数,要你在这n个数里面找到一些连续的数,这些数的数量大于等于m,并且他们的平均值在这n个数里面是最大的....... 思路:先把n个数的最大最小值确定,然后二分枚举平均值,对于每一个连续 ...
 - ajax的datatype选项的值
			
jquery ajax方法 1."xml":返回 XML 文档,可用 jQuery 处理. 2."html"::返回纯文本 HTML 信息:包含的 script ...
 - object not serializable (class: org.apache.kafka.clients.consumer.ConsumerRecord)
			
3. object not serializable (class: org.apache.kafka.clients.consumer.ConsumerRecord) val stream = ...