根據以前所說,學習一款MVC框架,必需要知道文件怎麼上傳的,那麼今天就來學習一下,SpringMVC是如何進行文件上傳的,須要進行哪些配置,代碼是如何編寫的。java
<?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>
<!—加入過濾器就是爲了上傳名字是中文的文件時 上傳到服務器上的文件名不會亂碼-->
<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>
複製代碼
<?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上傳文件時,需配置MultipartResolver處理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上傳文件的總大小不能超過200KB。注意maxUploadSize屬性的限制不是針對單個文件,而是全部文件的容量之和 -->
<property name="maxUploadSize" value="200000"/>
</bean>
<!-- SpringMVC在超出上傳文件限制時,會拋出org.springframework.web.multipart.MaxUploadSizeExceededException -->
<!-- 該異常是SpringMVC在檢查上傳的文件信息時拋出來的,並且此時尚未進入到Controller方法中 -->
<bean id="exceptionResolver"class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 遇到MaxUploadSizeExceededException異常時,自動跳轉到/WEB-INF/jsp/error_fileupload.jsp頁面 -->
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>
</props>
</property>
</bean>
</beans>
複製代碼
<%@ 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>
複製代碼
<%@ page language="java" pageEncoding="UTF-8"%>
<h1>文件過大,請從新選擇</h1>
複製代碼
/**
* SpringMVC中的文件上傳步驟:
* @第一步:因爲SpringMVC使用的是commons-fileupload實現,故將其組件引入項目中,這裏用到的是commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar
* @第二步:在####-servlet.xml中配置MultipartResolver處理器。可在此加入對上傳文件的屬性進行限制
* @第三步:在Controller的方法中添加MultipartFile參數。該參數用於接收表單中file組件的內容
* @第四步:編寫前臺表單。注意enctype="multipart/form-data"以及<input type="file" name="**"/> name要和後臺接收參數時的名字相同
*/
@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
{
//若是隻是上傳一個文件,則只須要MultipartFile類型接收文件便可,並且無需顯式指定@RequestParam註解
//若是想上傳多個文件,那麼這裏就要用MultipartFile[]類型來接收文件,而且還要指定@RequestParam註解
//而且上傳多個文件時,前臺表單中的全部<input type="file"/>的name都應該是myfiles,不然參數裏的myfiles沒法獲取到全部上傳的文件
for(MultipartFile myfile : myfiles)
{
if(myfile.isEmpty())
{
System.out.println("文件未上傳"); continue;
}
else
{
System.out.println("文件長度: " + myfile.getSize());
System.out.println("文件類型: " + myfile.getContentType());
System.out.println("文件名稱: " + myfile.getName());
System.out.println("文件原名: " + myfile.getOriginalFilename());
System.out.println("===================");
//若是用的是Tomcat服務器,則文件會上傳到\%TOMCAT_HOME%\webapps\YourWebProject\WEB-INF\upload\文件夾中
String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
//這裏沒必要處理IO流關閉的問題,由於FileUtils.copyInputStreamToFile()方法內部會自動把用到的IO流關掉,我是看它的源碼才知道的
FileUtils.copyInputStreamToFile(myfile.getInputStream(), new File(realPath + "/" +myfile.getOriginalFilename()));
}
}
return " success_fileupload ";
}
}
複製代碼
<%@ page language="java" pageEncoding="UTF-8"%>
<h1>恭喜你,文件上傳成功</h1>
複製代碼