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(文件上传)支持的更多相关文章

  1. Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC

    内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...

  2. Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图

    接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...

  3. Spring 4 官方文档学习(十一)Web MVC 框架

    介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...

  4. Spring 4 官方文档学习(十二)View技术

    关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...

  5. Spring Boot 官方文档学习(一)入门及使用

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  6. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  7. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)

    接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...

  8. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

    本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...

  9. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)

    题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...

  10. Spring 4 官方文档学习(十一)Web MVC 框架之编码式Servlet容器初始化

    在Servlet 3.0+ 环境中,你可以编码式配置Servlet容器,用来代替或者结合 web.xml文件.下面是注册DispatcherServlet : import org.springfra ...

随机推荐

  1. Tomcat7 catalina.out 日志切割

    安装步骤例如以下: 下载(最新版本号)     #  wget http://cronolog.org/download/cronolog-1.6.2.tar.gz 假设下载不了,直接网上查找,ftp ...

  2. POJ 2299:Ultra-QuickSort

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 39397   Accepted: 14204 ...

  3. 什么是BGP线路?什么是BGP机房?

    BGP(Border Gateway Protocol,边界网关协议)主要用于互联网AS(自治系统)之间的互联.BGP的最主要功能在于控制路由的传播和选择最好的路由.BGP是Internetproje ...

  4. hdu 4961 Boring Sum(高效)

    pid=4961" target="_blank" style="">题目链接:hdu 4961 Boring Sum 题目大意:给定ai数组; ...

  5. 解决Mac OS X 升级10.10(Yosemite)后ADT(Eclipse)无法找到真机

    升级Yosemite之后继续开发Android,发现当编译版本高于设备版本的时候设备选择器找不到真机了,WTF!难道要改低版本SDK开发不成?臣妾做不到啊! 后来捣鼓了一阵,发现解决方案有两个: 1. ...

  6. Linux内存管理机制中buffer和cache的区别

    Linux内存管理机制中buffer和cache的区别理解linux内存管理,需要深入了解linux内存的各个参数含义和规则,下面介绍一下Linux操作系统中内存buffer和cache的区别. Fr ...

  7. 【转】SQL SERVER 获取存储过程返回值

    1.OUPUT参数返回值 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEG ...

  8. C++ 链接Mysql 函数介绍

    通过MySQL自己的API函数进行连接 1.使用API的方式连接,需要加载mysql的头文件和lib文件.在VS2010的附加包含目录中添加\MySQL\MySQL Server 5.1\includ ...

  9. [py]python的继承体系

    python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done ...

  10. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...