Java Web之SpringMVC 上傳文件

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

一、首先是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%\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 "; 
    } 
} 
複製代碼

六、上傳文件成功的頁面/WEB-INF/jsp/success_fileupload.jsp

<%@ page language="java" pageEncoding="UTF-8"%> 
<h1>恭喜你,文件上傳成功</h1> 
複製代碼
相關文章
相關標籤/搜索