springMVC實現多文件上傳的方式有兩種,一種是我們經常使用的以字節流的方式進行文件上傳,另外一種是使用springMVC包裝好的解析器進行上傳。這兩種方式對于實現多文件上傳效率上卻有著很大的差距,下面我們通過實例來看一下這兩種方式的實現方式,同時比較一下在效率上到底存在著多大的差距。
1.下載相關jar包。需要引入的jar出了springMVC的jar包外,還需要引入com.springsource.org.apache.commons.fileupload-1.2.0.jar和com.springsource.org.apache.commons.io-1.4.0.jar。所有的jar包可以通過“點擊這里”進行下載。
2.配置springAnnotation-servlet.xml文件(文件名稱可以自定義,只要和web.xml中引入的名稱一樣即可):
[html]?view plaincopy
- <?xml?version="1.0"?encoding="UTF-8"?>??
- <!--?Bean頭部?-->??
- <beans?xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
- ????xmlns:p="http://www.springframework.org/schema/p"??
- ????xmlns:mvc="http://www.springframework.org/schema/mvc"??
- ????xmlns:context="http://www.springframework.org/schema/context"??
- ????xmlns:util="http://www.springframework.org/schema/util"??
- ????xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
- ????????????http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-3.0.xsd??
- ????????????http://www.springframework.org/schema/mvc?http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd??
- ????????????http://www.springframework.org/schema/util?http://www.springframework.org/schema/util/spring-util-3.0.xsd">??
- ?????
- ???<!--?注解掃描包?-->??
- ???<context:component-scan?base-package="com.tgb.web.controller.annotation"></context:component-scan>??
- ???<!--?代替下面的兩行代碼?-->??
- ???<mvc:annotation-driven/>??
- ????
- ???<!--?靜態資源訪問?-->??
- ???<mvc:resources?location="/img/"?mapping="/img/**"/>??
- ????<mvc:resources?location="/js/"?mapping="/js/**"/>??
- ?????
- ?????
- ???<bean?id="viewResolver"?class="org.springframework.web.servlet.view.InternalResourceViewResolver">??
- ????????<property?name="prefix"?value="/"></property>??
- ????????<property?name="suffix"?value=".jsp"></property>??
- ??????
- ???</bean>??
- ?????
- ???<bean?id="multipartResolver"?class="org.springframework.web.multipart.commons.CommonsMultipartResolver">??
- ????????<property?name="defaultEncoding"?value="utf-8"></property>???
- ????????<property?name="maxUploadSize"?value="10485760000"></property>??
- ????????<property?name="maxInMemorySize"?value="40960"></property>??
- ???</bean>??
- </beans>??
[html]?view plaincopy
- <?xml?version="1.0"?encoding="UTF-8"?>??
- <web-app?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns="http://java.sun.com/xml/ns/javaee"?xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"?xsi:schemaLocation="http://java.sun.com/xml/ns/javaee?http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"?id="WebApp_ID"?version="2.5">??
- ??<display-name>springMVC1</display-name>??
- ??<welcome-file-list>??
- ????<welcome-file>index.html</welcome-file>??
- ??</welcome-file-list>??
- ????
- ??<servlet>??
- ?????<servlet-name>springMVC</servlet-name>??
- ?????<!--?springMVC的分發器?-->??
- ?????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>??
- ?????<init-param>??
- ????????<param-name>contextConfigLocation</param-name>??
- ????????<param-value>classpath*:config/springAnnotation-servlet.xml</param-value>??
- ?????</init-param>??
- ?????<!--?表示當Tomcat已啟動的時候初始化這個Servlet?-->??
- ?????<load-on-startup>1</load-on-startup>??
- ??</servlet>??
- ????
- ??<filter>????
- ??????<filter-name>encodingFilter</filter-name>????
- ??????<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>????
- ??????<init-param>????
- ??????????<param-name>encoding</param-name>????
- ??????????<param-value>UTF-8</param-value>?<!--設置你想用的字符集,我這里用的是GB18030-->????
- ??????</init-param>????
- ??????<init-param>??
- ????????<param-name>forceEncoding</param-name>??
- ????????<param-value>true</param-value>??
- ??????</init-param>??
- ??</filter>????
- ??????
- ??<filter-mapping>????
- ??????<filter-name>encodingFilter</filter-name>????
- ??????<url-pattern>/*</url-pattern>?<!--設置你想過濾的頁面或者是Servlet,根據自己的需要配置-->????
- ?</filter-mapping>????
- ???
- ??<servlet-mapping>??
- ????<servlet-name>springMVC</servlet-name>??
- ????<url-pattern>/</url-pattern>??
- ??</servlet-mapping>??
- </web-app>??
[html]?view plaincopy
- <%@?page?language="java"?contentType="text/html;?charset=UTF-8"??
- ????pageEncoding="UTF-8"%>??
- <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">??
- <html>??
- <head>??
- <script?type="text/javascript"?src="../js/jquery-1.7.2.js"></script>??
- <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8">??
- <title>Insert?title?here</title>??
- <script?type="text/javascript">??
- ????i?=?1;??
- ????j?=?1;??
- ????$(document).ready(function(){??
- ??????????
- ????????$("#btn_add1").click(function(){??
- ????????????document.getElementById("newUpload1").innerHTML+='<div?id="div_'+i+'"><input??name="file"?type="file"??/><input?type="button"?value="刪除"??onclick="del_1('+i+')"/></div>';??
- ??????????????i?=?i?+?1;??
- ????????});??
- ??????????
- ????????$("#btn_add2").click(function(){??
- ????????????document.getElementById("newUpload2").innerHTML+='<div?id="div_'+j+'"><input??name="file_'+j+'"?type="file"??/><input?type="button"?value="刪除"??onclick="del_2('+j+')"/></div>';??
- ??????????????j?=?j?+?1;??
- ????????});??
- ????});??
- ??
- ????function?del_1(o){??
- ?????document.getElementById("newUpload1").removeChild(document.getElementById("div_"+o));??
- ????}??
- ??????
- ????function?del_2(o){??
- ?????????document.getElementById("newUpload2").removeChild(document.getElementById("div_"+o));??
- ????}??
- ??
- </script>??
- </head>??
- <body>??
- ??
- ?????<h1>springMVC字節流輸入上傳文件</h1>???
- ????<form?name="userForm1"?action="/springMVC7/file/upload"?enctype="multipart/form-data"?method="post">??
- ????????<div?id="newUpload1">??
- ????????????<input?type="file"?name="file">??
- ????????</div>??
- ??????????
- ????????<input?type="button"?id="btn_add1"?value="增加一行"?>??
- ????????<input?type="submit"?value="上傳"?>??
- ????</form>???
- ????<br>??
- ????<br>??
- ????<hr?align="left"?width="60%"?color="#FF0000"?size="3">??
- ????<br>??
- ????<br>??
- ?????<h1>springMVC包裝類上傳文件</h1>???
- ????<form?name="userForm2"?action="/springMVC7/file/upload2"?enctype="multipart/form-data"?method="post"">??
- ????????<div?id="newUpload2">??
- ????????????<input?type="file"?name="file">??
- ????????</div>??
- ????????<input?type="button"?id="btn_add2"?value="增加一行"?>??
- ????????<input?type="submit"?value="上傳"?>??
- ??????????
- ??????????
- ????</form>???
- </body>??
- </html>??
[java]?view plaincopy
- package?com.tgb.web.controller.annotation.upload;??
- ??
- import?java.io.File;??
- import?java.io.FileInputStream;??
- import?java.io.FileOutputStream;??
- import?java.io.IOException;??
- import?java.io.PrintWriter;??
- import?java.io.UnsupportedEncodingException;??
- import?java.net.URLDecoder;??
- import?java.util.Date;??
- import?java.util.Iterator;??
- ??
- import?javax.servlet.http.HttpServletRequest;??
- import?javax.servlet.http.HttpServletResponse;??
- import?javax.swing.filechooser.FileNameExtensionFilter;??
- ??
- import?org.springframework.stereotype.Controller;??
- import?org.springframework.web.bind.annotation.RequestMapping;??
- import?org.springframework.web.bind.annotation.RequestMethod;??
- import?org.springframework.web.bind.annotation.RequestParam;??
- import?org.springframework.web.multipart.MultipartFile;??
- import?org.springframework.web.multipart.MultipartHttpServletRequest;??
- import?org.springframework.web.multipart.commons.CommonsMultipartFile;??
- import?org.springframework.web.multipart.commons.CommonsMultipartResolver;??
- import?org.springframework.web.servlet.ModelAndView;??
- ??
- ??
- import?com.tgb.web.controller.entity.User;??
- ??
- @Controller??
- @RequestMapping("/file")??
- public?class?UploadController?{???
- ??????
- ??????
- ????@RequestMapping("/upload"???)??
- ????public?String?addUser(@RequestParam("file")?CommonsMultipartFile[]?files,HttpServletRequest?request){??
- ??????????
- ????????for(int?i?=?0;i<files.length;i++){??
- ????????????System.out.println("fileName---------->"?+?files[i].getOriginalFilename());??
- ??????????
- ????????????if(!files[i].isEmpty()){??
- ????????????????int?pre?=?(int)?System.currentTimeMillis();??
- ????????????????try?{??
- ????????????????????//拿到輸出流,同時重命名上傳的文件??
- ????????????????????FileOutputStream?os?=?new?FileOutputStream("H:/"?+?new?Date().getTime()?+?files[i].getOriginalFilename());??
- ????????????????????//拿到上傳文件的輸入流??
- ????????????????????FileInputStream?in?=?(FileInputStream)?files[i].getInputStream();??
- ??????????????????????
- ????????????????????//以寫字節的方式寫文件??
- ????????????????????int?b?=?0;??
- ????????????????????while((b=in.read())?!=?-1){??
- ????????????????????????os.write(b);??
- ????????????????????}??
- ????????????????????os.flush();??
- ????????????????????os.close();??
- ????????????????????in.close();??
- ????????????????????int?finaltime?=?(int)?System.currentTimeMillis();??
- ????????????????????System.out.println(finaltime?-?pre);??
- ??????????????????????
- ????????????????}?catch?(Exception?e)?{??
- ????????????????????e.printStackTrace();??
- ????????????????????System.out.println("上傳出錯");??
- ????????????????}??
- ????????}??
- ????????}??
- ????????return?"/success";??
- ????}??
- ??????
- ??????
- ????@RequestMapping("/upload2"??)??
- ????public?String?upload2(HttpServletRequest?request,HttpServletResponse?response)?throws?IllegalStateException,?IOException?{??
- ????????//創建一個通用的多部分解析器??
- ????????CommonsMultipartResolver?multipartResolver?=?new?CommonsMultipartResolver(request.getSession().getServletContext());??
- ????????//判斷?request?是否有文件上傳,即多部分請求??
- ????????if(multipartResolver.isMultipart(request)){??
- ????????????//轉換成多部分request????
- ????????????MultipartHttpServletRequest?multiRequest?=?(MultipartHttpServletRequest)request;??
- ????????????//取得request中的所有文件名??
- ????????????Iterator<String>?iter?=?multiRequest.getFileNames();??
- ????????????while(iter.hasNext()){??
- ????????????????//記錄上傳過程起始時的時間,用來計算上傳時間??
- ????????????????int?pre?=?(int)?System.currentTimeMillis();??
- ????????????????//取得上傳文件??
- ????????????????MultipartFile?file?=?multiRequest.getFile(iter.next());??
- ????????????????if(file?!=?null){??
- ????????????????????//取得當前上傳文件的文件名稱??
- ????????????????????String?myFileName?=?file.getOriginalFilename();??
- ????????????????????//如果名稱不為“”,說明該文件存在,否則說明該文件不存在??
- ????????????????????if(myFileName.trim()?!=""){??
- ????????????????????????System.out.println(myFileName);??
- ????????????????????????//重命名上傳后的文件名??
- ????????????????????????String?fileName?=?"demoUpload"?+?file.getOriginalFilename();??
- ????????????????????????//定義上傳路徑??
- ????????????????????????String?path?=?"H:/"?+?fileName;??
- ????????????????????????File?localFile?=?new?File(path);??
- ????????????????????????file.transferTo(localFile);??
- ????????????????????}??
- ????????????????}??
- ????????????????//記錄上傳該文件后的時間??
- ????????????????int?finaltime?=?(int)?System.currentTimeMillis();??
- ????????????????System.out.println(finaltime?-?pre);??
- ????????????}??
- ??????????????
- ????????}??
- ????????return?"/success";??
- ????}??
- ??????
- ????@RequestMapping("/toUpload"?)???
- ????public?String?toUpload()?{??
- ??????????
- ????????return?"/upload";??
- ????}??
- ??????
- }??
6.最后看后臺打印數據,數據來源于后臺打印的上傳文件所用的時間,第一幅圖片是使用字節流寫入方式完成三個文件上傳中每個文件用時,第二幅圖片是使用springMVC包裝好的解析器進行的三個相同的文件上傳中每個文件的用時:
字節流實現文件上傳的傳遞效率,結果顯示傳遞三個文件用時分別為534ms,453ms和387ms。
使用springMVC解析器進行文件上傳用時分別為2ms,1ms和2ms。
通過對比這兩種方式我們可以發現使用springMVC進行多文件的效率顯然要比字符流寫入方式效率上要高得多。