JavaWeb之SpringMVC上傳檔案

yungfan發表於2017-07-03

根據之前所說,學習一款MVC框架,必須要知道檔案怎麼上傳的,那麼今天就來學習一下,SpringMVC是如何進行檔案上傳的,需要進行哪些配置,程式碼是如何編寫的。

首先是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> 

<!—加入過濾器就是為了上傳名字是中文的檔案時 上傳到伺服器上的檔名不會亂碼--> 
<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上傳檔案時,需配置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> 

用於上傳的表單頁面/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> 

上傳檔案過大時的頁面/WEB-INF/jsp/error_fileupload.jsp

<%@ page language="java" pageEncoding="UTF-8"%> 
<h1>檔案過大,請重新選擇</h1> 

最後是核心的UploadController.java

/**
 * 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%webappsYourWebProjectWEB-INFupload資料夾中 
                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 "; 
    } 
} 

上傳檔案成功的頁面/WEB-INF/jsp/success_fileupload.jsp

<%@ page language="java" pageEncoding="UTF-8"%> 
<h1>恭喜你,檔案上傳成功</h1> 


相關文章