最近家裏的網出現了莫名其妙的問題,連不上碼雲了,因此把示例遷到了 github 上。本示例見這個項目的 master 分支的 ZestMultipartController.java。html
Spring 的內置 multipart 支持用於處理 Web 應用程序中的文件上傳。你能夠經過使用插件化的MultipartResolver
對象來啓用 multipart 支持,它定義在包org.springframework.web.multipart
中。Spring 提供了一個MultipartResolver
的實現,使用了 Apache 的 Commons FileUpload 和一些其餘的東西,用於對 Servlet 3.0 的 multipart 請求的解析。java
默認地,Spring 不進行 multipart 處理,由於不少開發者想要本身處理。你能夠經過在 Web 應用程序上下文中添加一個 multipart 解析器來啓用 Spring 的 multipart 處理。每個請求都要被檢查,看看是否包含一個 multipart。若是沒有發現 multipart,請求就正常繼續啦;若是有的話,你在上下文中聲明的MultipartResolver
就會開始工做啦。以後嘞,你就能夠像訪問其餘請求屬性那樣訪問 multipart 屬性啦。git
MultipartResolver
下面的例子展現了怎樣使用CommonsMultipartResolver
,快來看看吧:github
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 最大上傳大小,單位:字節(byte) --> <property name="maxUploadSize" value="100000"/> <!-- 你也能夠在這裏提供其餘的屬性 --> </bean>
固然啦,你也須要在類路徑下放上合適的 Jar 文件來保證 multipart 解析器工做。對於上面的例子嘞,你須要使用 commons-fileupload.jar。
當 Spring 的DispatcherServlet
檢測到一個 multi-part 請求時,它會激活你聲明好的解析器,而後把這個解析器轉交給請求。解析器會把當前的HttpServletRequest
扭曲(wrap?)爲 一個支持 multipart 文件上傳的MultipartHttpServletRequest
。使用這個MultipartHttpServletRequest
,你就能夠獲取這個請求中的 multipart 的信息了, 同時也能夠在你的控制器中訪問這些 multipart 文件。web
在MultipartResolver
完成本身的工做以後,你就能夠像處理其餘請求那樣處理當前請求了。首先,建立一個帶有<input type="file"/>
的表單,這樣用戶就能夠經過這個表單上傳文件了。爲表單添加編碼屬性(enctype="multipart/form-data"
)來讓瀏覽器直到把表單編碼爲 multipart 請求:spring
<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>
下一步是建立一個控制器來處理文件上傳。這個控制器和以前那種正常的控制器很像,不過咱們在方法參數上使用MultipartHttpServletRequest
或MultipartFile
:數據庫
@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
方法參數是怎樣映射到表單的 input 元素中的。在這個例子中,並無使用byte[]
作任何事,可是在實踐中,你能夠把它保存到數據庫中,也能夠保存到文件系統上等,隨你咯。apache
有時,想在上傳完頁面以後,頁面還保持在這裏,不去跳轉。這時,能夠藉助<iframe/>
。把上面的表單改爲下面那樣就行啦:瀏覽器
··· <form method="post" action="/form" enctype="multipart/form-data" target="myframe"> <input type="text" name="name"/> <input type="file" name="file"/> <input type="submit" value="上傳"/> </form> <iframe name="myframe"></iframe> ···