Spring MVC為文件上傳提供了直接的支持,這種支持是通過即插即用的MultipartResolver實現的。Spring使用Jakarta Commons FileUpload 技術實現了一個MultipartResolver實現類:CommonsMultipartResolver。
Spring MVC上下文中默認沒有裝配MultipartResolver,因此默認情況下不能處理文件的上傳工作。如果想要使用Spring的文件上傳功能,需要先在上下文中配置MultipartResolver。
第一步:配置MultipartResolver
使用CommonsMultipartResolver配置一個MultipartResolver解析器:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" p:maxUploadSize="5242880" p:uploadTempDir="upload/temp"
/>
defaultEncoding必須和用戶JSP的pageEncoding屬性一致,以便正確讀取表單的內容。uploadTempDir是文件上傳過程所使用的臨時目錄,文件上傳完成后,臨時目錄中的臨時文件會被自動清除。
第二步:編寫文件上傳表單頁面和控制器
JSP頁面如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <h1>選擇上傳文件</h1> <form action="<%=basePath%>user/upload.do" method="post" enctype="multipart/form-data"> 文件名:<input type="text" name="name" /><br/> <input type="file" name="file" /><br/> <input type="submit" /> </form> </body> </html>
注意:負責上傳的表單和一般表單有一些區別,表單的編碼類型必須是"Multipart/form-data"
控制器UserController如下:
package com.web; import java.io.File; import java.io.IOException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping(value = "/user") public class UserController { @RequestMapping(value = "/upload.do") public String updateThumb(@RequestParam("name") String name, @RequestParam("file") MultipartFile file) throws IllegalStateException, IOException { if (!file.isEmpty()) { file.transferTo(new File("d:/temp/" + name + file.getOriginalFilename().substring( file.getOriginalFilename().lastIndexOf(".")))); return "redirect:success.html"; } else { return "redirect:fail.html"; } } }
Spring MVC會將上傳文件綁定到MultipartFile對象中。MultipartFile提供了獲取上傳文件內容、文件名等內容,通過transferTo方法還可將文件存儲到硬件中,具體說明如下:
- byte[] getBytes() :獲取文件數據
- String getContentType():獲取文件MIME類型,如image/pjpeg、text/plain等
- InputStream getInputStream():獲取文件流
- String getName():獲取表單中文件組件的名字
- String getOriginalFilename():獲取上傳文件的原名
- long getSize():獲取文件的字節大小,單位為byte
- boolean isEmpty():是否有上傳的文件
- void transferTo(File dest):可以使用該文件將上傳文件保存到一個目標文件中