在Spring MVC中有兩種實現上傳文件的辦法,第一種是Servlet3.0如下的版本經過commons-fileupload與commons-io完成的通用上傳,第二種是Servlet3.0以上的版本的Spring內置標準上傳,不需藉助第3方組件。通用上傳也兼容Servlet3.0以上的版本css
Servlet3.0如下的經過commons-fileupload上傳html
1.添加上傳依賴包java
一個是文件上傳的jar包,一個是其所依賴的IO包。這兩個jar包,均在Spring支持庫的org.apache.commons中web
2.index.jsp(文件上傳頁面)spring
<%@ 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%>"> <style type="text/css"> form{ background-color:pink; width:500px; } </style> <title>單個文件上傳</title> </head> <body> <form action="${pageContext.request.contextPath }/first.do" method="post" enctype="multipart/form-data"> <h1>文件上傳</h1> 文件:<input type="file" name="uploadFile"/><br/> <input type="submit" value="上傳"/> </form> </body> </html>
applicationContext.xmlapache
先在大配置中配置個包掃描器,後面的後續會引出spring-mvc
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 包掃描器 --> <context:component-scan base-package="cn.controller"></context:component-scan> </beans>
書寫處理器服務器
package cn.controller; import java.io.File; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; /** * * @author 景佩佩 * */ @Controller public class MyController{ //處理器方法 @RequestMapping(value="/first.do") //springmvc類型 /** * 將文件對象保存到文件(圖片)服務器上 Nugux * * @param uploadFile 從頁面上過來的真實文件對象 * @return * @throws Exception */ public String doFirst(MultipartFile uploadFile,HttpSession session) throws Exception{ //全部文件上傳 //1.xxx:獲取文件名做爲保存到服務器的文件名稱 1.jpg String filename = uploadFile.getOriginalFilename();
//2.前半部分路徑,目錄,將WebRoot下一個名稱爲images文件夾 轉換成絕對路徑 String leftPath = session.getServletContext().getRealPath("/images"); //3.進行路徑拼接=前半部分路徑+文件名稱 File file=new File(leftPath,filename); //4.作保存 uploadFile.transferTo(file); return "welcome.jsp"; } }
若是咱們如今啓動服務器,會報錯session
在applicationContext.xml配置文件上傳解析器mvc
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 配置包掃描器--> <context:component-scan base-package="cn.controller"></context:component-scan> <!-- 文件上傳解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> </beans>
可是啓動的話仍是會報錯,由於咱們沒有配置註解驅動
若是咱們沒有寫解析器的ID的話,就會報另外的錯
文件上傳大小設置
若是超過限制的大小的話會報以下的錯
沒有選擇要上傳的文件
若是沒有選擇要上傳的文件,能夠經過以下判斷代碼回到錯誤頁
限制上傳的文件
若是咱們上傳的文件中有亂碼的問題,咱們可使用如下兩種方式
1)
2)
<filter> <filter-name>characterEncoding</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping
首先index.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%>"> <style type="text/css"> form{ background-color:pink; width:500px; } </style> <title></title> </head> <body> <form action="${pageContext.request.contextPath }/first.do" method="post" enctype="multipart/form-data"> <h1>文件上傳</h1> 文件1:<input type="file" name="uploadFile"/><br/> 文件2:<input type="file" name="uploadFile"/><br/> 文件3:<input type="file" name="uploadFile"/><br/> <input type="submit" value="上傳"/> </form> </body> </html>
2.applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 包掃描器 --> <context:component-scan base-package="cn.controller"></context:component-scan> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="50000000"></property> <property name="maxUploadSizePerFile" value="5000000"></property> <property name="defaultEncoding" value="utf-8"></property> </bean> <!--mvc註解驅動 包括:建立MultipartFile 實例 --> <mvc:annotation-driven/> </beans>
3.書寫處理器
package cn.controller; import java.io.File; import javax.servlet.http.HttpSession; 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; /** * * @author 景佩佩 * */ @Controller public class MyController{ //處理器方法 @RequestMapping(value="/first.do") //springmvc類型 /** * 將文件對象保存到文件(圖片)服務器上 Nugux * * @param uploadFile 從頁面上過來的真實文件對象 * @return * @throws Exception */ public String doFirst(@RequestParam MultipartFile[] uploadFile,HttpSession session) throws Exception{ for (MultipartFile item : uploadFile) { if (item.getSize()>0) { //經過文件後綴名斷定只能讓用戶上傳 .jpg .gif .png //全部文件上傳 //1.xxx:獲取文件名做爲保存到服務器的文件名稱 1.jpg String filename = item.getOriginalFilename(); if (filename.endsWith("jpg")||filename.endsWith("gif")||filename.endsWith("png")) { //2.前半部分路徑,目錄,將WebRoot下一個名稱爲images文件夾 轉換成絕對路徑 String leftPath = session.getServletContext().getRealPath("/images"); //3.進行路徑拼接=前半部分路徑+文件名稱 File file=new File(leftPath,filename); item.transferTo(file); } }else { return "error.jsp"; } } return "welcome.jsp"; } }
提醒:在處理器方法中必定要對參數進行校對使用註解@RequestParam校訂參數
要否則會報以下錯誤
以後就能夠實現文件上傳
index.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%>"> <style type="text/css"> form{ background-color:pink; width:500px; } </style> <title>單個文件上傳</title> </head> <body> <form action="${pageContext.request.contextPath }/download.do" method="post" enctype="multipart/form-data"> <h1>文件下載</h1> <a href="${pageContext.request.contextPath }/download.do?1.jpg">下載</a> </form> </body> </html>
applicationContext.xml不用配置(與以前上傳的同樣)
處理器MyController