本文示例见这个项目的 upload 分支下的项目(这个项目是为本文单独建立的)。
WARNING:本文中有一部分直接把英文原文搬过来了,我的翻译能力实在有限,凑合看吧。
Spring 的内置 multipart 支持用于处理 Web 应用程序中的文件上传。你可以通过使用插件化的MultipartResolver
对象来启用 multipart 支持,它定义在包org.springframework.web.multipart
中。Spring 提供了一个MultipartResolver
的实现,使用了 Apache 的 Commons FileUpload 和一些其他的东西,用于对 Servlet 3.0 的 multipart 请求的解析。
默认地,Spring 不进行 multipart 处理,因为很多开发者想要自己处理。你可以通过在 Web 应用程序上下文中添加一个 multipart 解析器来启用 Spring 的 multipart 处理。每一个请求都要被检查,看看是否包含一个 multipart。如果没有发现 multipart,请求就正常继续啦;如果有的话,你在上下文中声明的MultipartResolver
就会开始工作啦。之后嘞,你就可以像访问其他请求属性那样访问 multipart 属性啦。
和Servlet 3.0一起使用MultipartResolver
为了使用基于 multipart 解析(parse)的 Servlet 3.0,你可以在DispatcherServlet
上加个标记,这个标记可以是 web.xml 中的一个“multipart-config
”片段,也可以是一个在编程 Servlet注册中的 MultipartConfigElement(or with a javax.servlet.MultipartConfigElement in programmatic Servlet registration),or in case of a custom Servlet class possibly with a javax.servlet.annotation.MultipartConfig annotation on your Servlet class。配置设置如文件最大长度或者存储路径需要应用在 Serlvet 注册级别,因为 Servlet 3.0 不允许从MultipartResolver
完成这些设置。
一旦你通过上面的任意一种方式启用了 Servlet 3.0 的 multipart解析,你需要添加
StandardServletMultipartResolver`到你的 Spring 配置中:
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>
配置 web.xml 文件
这里使用<multipart-config/>
。如下:
......
<servlet>
<description>Spring MVC 核心 Servlet</description>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<multipart-config>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
<load-on-startup>1</load-on-startup>
</servlet>
......
在表单中处理文件上传
在MultipartResolver
完成自己的工作之后,你就可以像处理其他请求那样处理当前请求了。首先,创建一个带有<input type="file"/>
的表单,这样用户就可以通过这个表单上传文件了。为表单添加编码属性 (enctype="multipart/form-data") 来让浏览器直到把表单编码为 multipart 请求:
<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>
配置处理上传文件的控制器
在使用 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";
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。