本文示例见这个项目的 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";
    }
}

行一
51 声望35 粉丝

人不可能记住所有的细节