根據(jù)之前所說,學(xué)習(xí)一款MVC框架,必須要知道文件怎么上傳的,那么今天就來學(xué)習(xí)一下,SpringMVC是如何進(jìn)行文件上傳的,需要進(jìn)行哪些配置,代碼是如何編寫的。
首先是web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!—加入過濾器就是為了上傳名字是中文的文件時(shí) 上傳到服務(wù)器上的文件名不會(huì)亂碼-->
<filter>
<filter-name>SpringCharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SpringCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
SpringMVC的配置文件upload-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<context:component-scan base-package="com.yf.upload"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- SpringMVC上傳文件時(shí),需配置MultipartResolver處理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上傳文件的總大小不能超過200KB。注意maxUploadSize屬性的限制不是針對(duì)單個(gè)文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="200000"/>
</bean>
<!-- SpringMVC在超出上傳文件限制時(shí),會(huì)拋出org.springframework.web.multipart.MaxUploadSizeExceededException -->
<!-- 該異常是SpringMVC在檢查上傳的文件信息時(shí)拋出來的,而且此時(shí)還沒有進(jìn)入到Controller方法中 -->
<bean id="exceptionResolver"class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 遇到MaxUploadSizeExceededException異常時(shí),自動(dòng)跳轉(zhuǎn)到/WEB-INF/jsp/error_fileupload.jsp頁(yè)面 -->
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>
</props>
</property>
</bean>
</beans>
用于上傳的表單頁(yè)面/WEB-INF/jsp/upload.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<form method="POST" enctype="multipart/form-data">
yourfile: <input type="file" name="myfiles"/><br/>
yourfile: <input type="file" name="myfiles"/><br/>
yourfile: <input type="file" name="myfiles"/><br/>
<input type="submit" value="上傳文件"/>
</form>
上傳文件過大時(shí)的頁(yè)面/WEB-INF/jsp/error_fileupload.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<h1>文件過大,請(qǐng)重新選擇</h1>
最后是核心的UploadController.java
/**
* SpringMVC中的文件上傳步驟:
* @第一步:由于SpringMVC使用的是commons-fileupload實(shí)現(xiàn),故將其組件引入項(xiàng)目中,這里用到的是commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar
* @第二步:在####-servlet.xml中配置MultipartResolver處理器??稍诖思尤雽?duì)上傳文件的屬性進(jìn)行限制
*@第三步:在Controller的方法中添加MultipartFile參數(shù)。該參數(shù)用于接收表單中file組件的內(nèi)容
*@第四步:編寫前臺(tái)表單。注意enctype="multipart/form-data"以及<input type="file" name="**"/> name要和后臺(tái)接收參數(shù)時(shí)的名字相同
*/
@Controller
public class TestController
{
@RequestMapping(value="/uploadfile",method=RequestMethod.GET)
public String upLoadFile()
{
return "upload";
}
@RequestMapping(value="/uploadfile",method=RequestMethod.POST)
public String upLoadFile(@RequestParam MultipartFile[] myfiles, HttpServletRequest request) throws IOException
{
//如果只是上傳一個(gè)文件,則只需要MultipartFile類型接收文件即可,而且無需顯式指定@RequestParam注解
//如果想上傳多個(gè)文件,那么這里就要用MultipartFile[]類型來接收文件,并且還要指定@RequestParam注解
//并且上傳多個(gè)文件時(shí),前臺(tái)表單中的所有<input type="file"/>的name都應(yīng)該是myfiles,否則參數(shù)里的myfiles無法獲取到所有上傳的文件
for(MultipartFile myfile : myfiles)
{
if(myfile.isEmpty())
{
System.out.println("文件未上傳"); continue;
}
else
{
System.out.println("文件長(zhǎng)度: " + myfile.getSize());
System.out.println("文件類型: " + myfile.getContentType());
System.out.println("文件名稱: " + myfile.getName());
System.out.println("文件原名: " + myfile.getOriginalFilename());
System.out.println("===================");
//如果用的是Tomcat服務(wù)器,則文件會(huì)上傳到\%TOMCAT_HOME%\webapps\YourWebProject\WEB-INF\upload\文件夾中
String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
//這里不必處理IO流關(guān)閉的問題,因?yàn)镕ileUtils.copyInputStreamToFile()方法內(nèi)部會(huì)自動(dòng)把用到的IO流關(guān)掉,我是看它的源碼才知道的
FileUtils.copyInputStreamToFile(myfile.getInputStream(), new File(realPath + "/" +myfile.getOriginalFilename()));
}
}
return " success_fileupload ";
}
}
上傳文件成功的頁(yè)面/WEB-INF/jsp/success_fileupload.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<h1>恭喜你,文件上傳成功</h1>