springMVC两种方式实现多文件上传及效率比较

来源:互联网 发布:汉字扫描识别软件 编辑:程序博客网 时间:2024/05/18 02:03

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 plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!-- Bean头部 -->  
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  7.     xmlns:context="http://www.springframework.org/schema/context"  
  8.     xmlns:util="http://www.springframework.org/schema/util"  
  9.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  10.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  11.             http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  12.             http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">  
  13.      
  14.    <!-- 注解扫描包 -->  
  15.    <context:component-scan base-package="com.tgb.web.controller.annotation"></context:component-scan>  
  16.    <!-- 代替下面的两行代码 -->  
  17.    <mvc:annotation-driven/>  
  18.     
  19.    <!-- 静态资源访问 -->  
  20.    <mvc:resources location="/img/" mapping="/img/**"/>  
  21.     <mvc:resources location="/js/" mapping="/js/**"/>  
  22.      
  23.      
  24.    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  25.         <property name="prefix" value="/"></property>  
  26.         <property name="suffix" value=".jsp"></property>  
  27.       
  28.    </bean>  
  29.      
  30.    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  31.         <property name="defaultEncoding" value="utf-8"></property>   
  32.         <property name="maxUploadSize" value="10485760000"></property>  
  33.         <property name="maxInMemorySize" value="40960"></property>  
  34.    </bean>  
  35. </beans>  
3. 配置web.xml文件:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.   <display-name>springMVC1</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.html</welcome-file>  
  6.   </welcome-file-list>  
  7.     
  8.   <servlet>  
  9.      <servlet-name>springMVC</servlet-name>  
  10.      <!-- springMVC的分发器 -->  
  11.      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  12.      <init-param>  
  13.         <param-name>contextConfigLocation</param-name>  
  14.         <param-value>classpath*:config/springAnnotation-servlet.xml</param-value>  
  15.      </init-param>  
  16.      <!-- 表示当Tomcat已启动的时候初始化这个Servlet -->  
  17.      <load-on-startup>1</load-on-startup>  
  18.   </servlet>  
  19.     
  20.   <filter>    
  21.       <filter-name>encodingFilter</filter-name>    
  22.       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    
  23.       <init-param>    
  24.           <param-name>encoding</param-name>    
  25.           <param-value>UTF-8</param-value> <!--设置你想用的字符集,我这里用的是GB18030-->    
  26.       </init-param>    
  27.       <init-param>  
  28.         <param-name>forceEncoding</param-name>  
  29.         <param-value>true</param-value>  
  30.       </init-param>  
  31.   </filter>    
  32.       
  33.   <filter-mapping>    
  34.       <filter-name>encodingFilter</filter-name>    
  35.       <url-pattern>/*</url-pattern> <!--设置你想过滤的页面或者是Servlet,根据自己的需要配置-->    
  36.  </filter-mapping>    
  37.    
  38.   <servlet-mapping>  
  39.     <servlet-name>springMVC</servlet-name>  
  40.     <url-pattern>/</url-pattern>  
  41.   </servlet-mapping>  
  42. </web-app>  
4. jsp页面代码:
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <script type="text/javascript" src="../js/jquery-1.7.2.js"></script>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>Insert title here</title>  
  9. <script type="text/javascript">  
  10.     i = 1;  
  11.     j = 1;  
  12.     $(document).ready(function(){  
  13.           
  14.         $("#btn_add1").click(function(){  
  15.             document.getElementById("newUpload1").innerHTML+='<div id="div_'+i+'"><input  name="file" type="file"  /><input type="button" value="删除"  onclick="del_1('+i+')"/></div>';  
  16.               i = i + 1;  
  17.         });  
  18.           
  19.         $("#btn_add2").click(function(){  
  20.             document.getElementById("newUpload2").innerHTML+='<div id="div_'+j+'"><input  name="file_'+j+'" type="file"  /><input type="button" value="删除"  onclick="del_2('+j+')"/></div>';  
  21.               j = j + 1;  
  22.         });  
  23.     });  
  24.   
  25.     function del_1(o){  
  26.      document.getElementById("newUpload1").removeChild(document.getElementById("div_"+o));  
  27.     }  
  28.       
  29.     function del_2(o){  
  30.          document.getElementById("newUpload2").removeChild(document.getElementById("div_"+o));  
  31.     }  
  32.   
  33. </script>  
  34. </head>  
  35. <body>  
  36.   
  37.      <h1>springMVC字节流输入上传文件</h1>   
  38.     <form name="userForm1" action="/springMVC7/file/upload" enctype="multipart/form-data" method="post">  
  39.         <div id="newUpload1">  
  40.             <input type="file" name="file">  
  41.         </div>  
  42.           
  43.         <input type="button" id="btn_add1" value="增加一行" >  
  44.         <input type="submit" value="上传" >  
  45.     </form>   
  46.     <br>  
  47.     <br>  
  48.     <hr align="left" width="60%" color="#FF0000" size="3">  
  49.     <br>  
  50.     <br>  
  51.      <h1>springMVC包装类上传文件</h1>   
  52.     <form name="userForm2" action="/springMVC7/file/upload2" enctype="multipart/form-data" method="post"">  
  53.         <div id="newUpload2">  
  54.             <input type="file" name="file">  
  55.         </div>  
  56.         <input type="button" id="btn_add2" value="增加一行" >  
  57.         <input type="submit" value="上传" >  
  58.           
  59.           
  60.     </form>   
  61. </body>  
  62. </html>  
5.实现上传功能的java bean:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.tgb.web.controller.annotation.upload;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.PrintWriter;  
  8. import java.io.UnsupportedEncodingException;  
  9. import java.net.URLDecoder;  
  10. import java.util.Date;  
  11. import java.util.Iterator;  
  12.   
  13. import javax.servlet.http.HttpServletRequest;  
  14. import javax.servlet.http.HttpServletResponse;  
  15. import javax.swing.filechooser.FileNameExtensionFilter;  
  16.   
  17. import org.springframework.stereotype.Controller;  
  18. import org.springframework.web.bind.annotation.RequestMapping;  
  19. import org.springframework.web.bind.annotation.RequestMethod;  
  20. import org.springframework.web.bind.annotation.RequestParam;  
  21. import org.springframework.web.multipart.MultipartFile;  
  22. import org.springframework.web.multipart.MultipartHttpServletRequest;  
  23. import org.springframework.web.multipart.commons.CommonsMultipartFile;  
  24. import org.springframework.web.multipart.commons.CommonsMultipartResolver;  
  25. import org.springframework.web.servlet.ModelAndView;  
  26.   
  27.   
  28. import com.tgb.web.controller.entity.User;  
  29.   
  30. @Controller  
  31. @RequestMapping("/file")  
  32. public class UploadController {   
  33.       
  34.       
  35.     @RequestMapping("/upload"   )  
  36.     public String addUser(@RequestParam("file") CommonsMultipartFile[] files,HttpServletRequest request){  
  37.           
  38.         for(int i = 0;i<files.length;i++){  
  39.             System.out.println("fileName---------->" + files[i].getOriginalFilename());  
  40.           
  41.             if(!files[i].isEmpty()){  
  42.                 int pre = (int) System.currentTimeMillis();  
  43.                 try {  
  44.                     //拿到输出流,同时重命名上传的文件  
  45.                     FileOutputStream os = new FileOutputStream("H:/" + new Date().getTime() + files[i].getOriginalFilename());  
  46.                     //拿到上传文件的输入流  
  47.                     FileInputStream in = (FileInputStream) files[i].getInputStream();  
  48.                       
  49.                     //以写字节的方式写文件  
  50.                     int b = 0;  
  51.                     while((b=in.read()) != -1){  
  52.                         os.write(b);  
  53.                     }  
  54.                     os.flush();  
  55.                     os.close();  
  56.                     in.close();  
  57.                     int finaltime = (int) System.currentTimeMillis();  
  58.                     System.out.println(finaltime - pre);  
  59.                       
  60.                 } catch (Exception e) {  
  61.                     e.printStackTrace();  
  62.                     System.out.println("上传出错");  
  63.                 }  
  64.         }  
  65.         }  
  66.         return "/success";  
  67.     }  
  68.       
  69.       
  70.     @RequestMapping("/upload2"  )  
  71.     public String upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException {  
  72.         //创建一个通用的多部分解析器  
  73.         CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());  
  74.         //判断 request 是否有文件上传,即多部分请求  
  75.         if(multipartResolver.isMultipart(request)){  
  76.             //转换成多部分request    
  77.             MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;  
  78.             //取得request中的所有文件名  
  79.             Iterator<String> iter = multiRequest.getFileNames();  
  80.             while(iter.hasNext()){  
  81.                 //记录上传过程起始时的时间,用来计算上传时间  
  82.                 int pre = (int) System.currentTimeMillis();  
  83.                 //取得上传文件  
  84.                 MultipartFile file = multiRequest.getFile(iter.next());  
  85.                 if(file != null){  
  86.                     //取得当前上传文件的文件名称  
  87.                     String myFileName = file.getOriginalFilename();  
  88.                     //如果名称不为“”,说明该文件存在,否则说明该文件不存在  
  89.                     if(myFileName.trim() !=""){  
  90.                         System.out.println(myFileName);  
  91.                         //重命名上传后的文件名  
  92.                         String fileName = "demoUpload" + file.getOriginalFilename();  
  93.                         //定义上传路径  
  94.                         String path = "H:/" + fileName;  
  95.                         File localFile = new File(path);  
  96.                         file.transferTo(localFile);  
  97.                     }  
  98.                 }  
  99.                 //记录上传该文件后的时间  
  100.                 int finaltime = (int) System.currentTimeMillis();  
  101.                 System.out.println(finaltime - pre);  
  102.             }  
  103.               
  104.         }  
  105.         return "/success";  
  106.     }  
  107.       
  108.     @RequestMapping("/toUpload" )   
  109.     public String toUpload() {  
  110.           
  111.         return "/upload";  
  112.     }  
  113.       
  114. }  

6.最后看后台打印数据,数据来源于后台打印的上传文件所用的时间,第一幅图片是使用字节流写入方式完成三个文件上传中每个文件用时,第二幅图片是使用springMVC包装好的解析器进行的三个相同的文件上传中每个文件的用时:

字节流实现文件上传的传递效率,结果显示传递三个文件用时分别为534ms,453ms和387ms。


使用springMVC解析器进行文件上传用时分别为2ms,1ms和2ms。


通过对比这两种方式我们可以发现使用springMVC进行多文件的效率显然要比字符流写入方式效率上要高得多。

转自:http://blog.csdn.net/a1314517love/article/details/24183273

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行卡丢了补办后支付宝账户怎么办 未激活的银行卡被锁定了怎么办 手机网银上的钱被盗走了怎么办 支付宝支付失败银行卡扣了钱怎么办 小程序的二次验证码丢失怎么办 苹果手机不小心购买游戏币怎么办 在淘宝买的洗衣粉是假的怎么办 京东快递电话填错了怎么办 新买的手机卡被注册过支付宝怎么办 手机卡掉了别人登陆支付宝怎么办 手机卡注销了支付宝欠的钱怎么办 手机丢了支付宝和微信里的钱怎么办 新办的手机号已被注册支付宝怎么办 新办的移动卡不能注册支付宝怎么办 新办的宝卡支付宝注册过怎么办 办支付宝后银行卡被盗刷怎么办 微信扫二维码送平衡群发了怎么办车 拼多多没收到货点了确认收货怎么办 拼多多收货地址填错了怎么办 京东订单申请退款已发货怎么办 手机播放声音的地方进水了怎么办 手机出声音的地方进水了怎么办 手机听声音的地方进水了怎么办 装修公司我只要基装她不肯怎么办 雄迈未来家庭忘记账号和密码怎么办 地方文件和国家政策有冲突怎么办? 网上贷款放款成功没有到账怎么办 我来贷放款中不到账怎么办 手持身份证被别人网贷了怎么办 身份证被别人做了网贷怎么办 身份证丢了被别人网贷了怎么办 户口身份证被注销了网贷怎么办 首付交了贷款办不下来怎么办 付首付后贷款没有批下来怎么办 交了首付贷款没有办下来怎么办 买房交了首付贷款没批下来怎么办 交完首付办不下来贷款怎么办 房子交了首付贷款办不下来怎么办 浦发银行办理房贷流水不够怎么办 房贷审批过程中突然换工作怎么办 建行快贷结清后无额度怎么办