7.二、使用基於 Servlet 3.0 的文件上傳

  本文示例見這個項目的 upload 分支下的項目(這個項目是爲本文單獨創建的)。html

  WARNING:本文中有一部分直接把英文原文搬過來了,個人翻譯能力實在有限,湊合看吧。java


  Spring 的內置 multipart 支持用於處理 Web 應用程序中的文件上傳。你能夠經過使用插件化的MultipartResolver對象來啓用 multipart 支持,它定義在包org.springframework.web.multipart中。Spring 提供了一個MultipartResolver的實現,使用了 Apache 的 Commons FileUpload 和一些其餘的東西,用於對 Servlet 3.0 的 multipart 請求的解析。git

  默認地,Spring 不進行 multipart 處理,由於不少開發者想要本身處理。你能夠經過在 Web 應用程序上下文中添加一個 multipart 解析器來啓用 Spring 的 multipart 處理。每個請求都要被檢查,看看是否包含一個 multipart。若是沒有發現 multipart,請求就正常繼續啦;若是有的話,你在上下文中聲明的MultipartResolver就會開始工做啦。以後嘞,你就能夠像訪問其餘請求屬性那樣訪問 multipart 屬性啦。github

和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完成這些設置。web

  一旦你經過上面的任意一種方式啓用了 Servlet 3.0 的 multipart解析,你須要添加StandardServletMultipartResolver`到你的 Spring 配置中: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來做爲方法參數:mvc

@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";
    }
}
相關文章
相關標籤/搜索