項目代碼:https://github.com/PeiranZhang/springmvc-fileupload
Servlet3.0之前使用文件上傳功能
Servlet3.0之前需要使用commons file upload和commons io組件,依賴一下了兩個jar
- commons-fileupload-1.3.jar
- commons-io-2.4.jar
spring配置文件中配置bean
<!--Servlet 3.0之前,需要定義CommonsMultipartResolver來支持文件上傳功能,bean id固定為"multipartResolver"-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--定義上傳文件最大為1KB-->
<property name="maxUploadSize" value="1000000"/>
<property name="uploadTempDir" value="file:E://tmp"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
文件上傳jsp編寫
下面代碼中,指定了enctype,同時使用了多個文件上傳,name="files"。另外,form表單中也可以使用其他的文本框。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上傳</title>
</head>
<body>
<!--需要指定enctype="multipart/form-data",才能使用文件上傳功能-->
<form action="save_file" method="post" enctype="multipart/form-data" >
<table>
<tr>
<td>Select a file to upload</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td>Select a file to upload</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td>Name</td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
</form>
</body>
</html
Contorller處理代碼
@Controller
public class UploadFileController {
@RequestMapping(value = "/upload_file")
public String uploadFile(){
return "uploadFile";
}
@RequestMapping(value = "/save_file")
/**
* 多個文件上傳,對應需要MultipartFile[]數組,否則不需要數組
*/
public String saveFile(@RequestParam("files")MultipartFile[] files,
@RequestParam("name") String name,
HttpServletRequest request,Model model){
//保存文件
if(files != null && files.length > 0){
for(MultipartFile file : files){
String fileName = file.getOriginalFilename();
String dir = "E://test";
File saveFile = new File(dir,fileName);
try {
//文件保存到本地
file.transferTo(saveFile);
}catch (Exception e){
e.printStackTrace();
}
}
}
//顯示添加請求對象,在fileLists.jsp重可以使用EL表達式訪問對象,即${files}
request.setAttribute("files",files);
request.setAttribute("name",name);
//也可以不添加對象,在fileLists.jsp總可以直接使用EL隱式對象param來訪問,即${param.email}來訪問
//request.setAttribute("email",email);
//使用Model添加,為啥在jsp中訪問不到?
//model.addAttribute(files);
//model.addAttribute(name);
return "fileLists";
}
}
Controller中處理方法使用@RequestParam注解接受請求中的參數,傳遞給處理方法參數,使用MultipartFile數組參數接收上傳的文件。另外,可以通過在參數中定義HttpServletRequest對象來獲得原始的請求對象,然后調用request.setAttribute方法設置視圖對象,在返回的jsp視圖中通過EL表達式引用這些對象,EL表達式中提供了一些隱式對象,例如param,這是一個包含所有請求參數,並用參數名作為key的Map,通過param隱式對象,可以直接訪問某一個請求參數。具體訪問方式見代碼中注解部分。
fileLists.jsp代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
<title>File List</title>
</head>
<body>
<table>
<tr>
<td>Name:</td>
<td>${name}</td>
</tr>
<tr>
<td>Email</td>
<td>${param.email}</td>
</tr>
<c:forEach items="${files}" var="file">
<tr>
<td>OriginalFileName:</td>
<td>${file.originalFilename}</td>
</tr>
<tr>
<td>Type:</td>
<td>${file.contentType}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
fileLists.jsp中通過EL表達式來訪問對象,包含param隱式對象和controller中添加的files對象,該對象為MultipartFile數組
Servlet3.0及3.0之后使用文件上傳功能
有了Servlet 3.0,就不需要Commons FileUpload和Commons IO元件了。在Servlet 3.0及其以上版本的容器中進行服務器端文件上傳的編程,是圍繞着注解類型MultipartConfig和javax. servlet.http.Part接口進行的。處理已上傳文件的Servlets必須以@MultipartConfig進行注解。Spring MVC的DispatcherServlet處理大部分或者所有請求。如果不修改源代碼,將無法對Servlet進行注解。但值得慶幸的是,Servlet 3.0中有一種比較容易的方法,能使一個Servlet變成一個MultipartConfig Servlet,即給部署描述符(web.xml)中的Servlet聲明賦值。在web.xml中添加multipart-config標簽與用@MultipartConfig給DispatcherServlet進行注解的效果一樣。
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation配置springmvc加載的配置文件適配器、處理映射器等-->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/springmvc-config.xml</param-value>
</init-param>
<!--值不為0表示,tomcat啟動該應用時,加載servlet,而不是等到第一請求到來時再加載servlet-->
<load-on-startup>1</load-on-startup>
<multipart-config>
<!--臨時目錄,需要目錄存在,否則報錯-->
<location>E:\\tmp</location>
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size>
<!--上傳文件超出這個容量界限時,會被寫入磁盤。-->
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 所有訪問都由DispatcherServlet進行解析-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring配置文件中,配置multipartResolver
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>
結果
參考
- spring-file-upload
- 《JSP、Servlet和SpringMVC學習指南》