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

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。

2.配置springAnnotation-servlet.xml文件(文件名称可以自定义,只要和web.xml中引入的名称一样即可):

<?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>

3. 配置web.xml文件:

<?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>

4. jsp页面代码:

<%@ 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>

5.实现上传功能的java bean:

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进行多文件的效率显然要比字符流写入方式效率上要高得多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索springmvc
, spring
, mvc
, 文件上传
多文件上传
springmvc注解详解、spring mvc.xml详解、spring4 mvc配置详解、spring mvc原理详解、spring mvc源码详解,以便于您获取更多的相关知识。

时间: 2025-01-01 10:15:32

详解springMVC两种方式实现多文件上传及效率比较_java的相关文章

实例-Android 与蓝牙键盘两种方式都连接不上,可是与hc06可以连接,uuid的问题还是其他问题

问题描述 Android 与蓝牙键盘两种方式都连接不上,可是与hc06可以连接,uuid的问题还是其他问题 class ItemClickEvent implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { btAdapt.cancelDiscovery(); String str =

04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

 1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mvc结构  DispatcherServlet:中央控制器,把请求给转发到具体的控制类 Controller:具体处理请求的控制器(配置文件方式需要配置,注解方式不用配置) handlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略 ModelAndView:服

Ajax方式提交带文件上传的表单及隐藏iframe应用

一般的表单都是通过ajax方式提交,所以碰到带文件上传的表单就比较麻烦.基本原理就是在页面增加一个隐藏iframe,然后通过ajax提交除文件之外的表单数据,在表单数据提交成功之后的回调函数中,通过form单独提交文件,而这个提交文件的form的target就指向前述隐藏的iframe. html 代码 复制代码 代码如下: <html> <body> <form action="upload.jsp" id="form1" name=

Ajax方式提交带文件上传的表单及隐藏iframe应用_AJAX相关

一般的表单都是通过ajax方式提交,所以碰到带文件上传的表单就比较麻烦.基本原理就是在页面增加一个隐藏iframe,然后通过ajax提交除文件之外的表单数据,在表单数据提交成功之后的回调函数中,通过form单独提交文件,而这个提交文件的form的target就指向前述隐藏的iframe. html 代码 复制代码 代码如下: <html> <body> <form action="upload.jsp" id="form1" name=

MyBatis与SpringMVC相结合实现文件上传、下载功能_java

环境:maven+SpringMVC + Spring + MyBatis + MySql 本文主要说明如何使用input上传文件到服务器指定目录,或保存到数据库中:如何从数据库下载文件,和显示图像文件并实现缩放. 将文件存储在数据库中,一般是存文件的byte数组,对应的数据库数据类型为blob. 首先要创建数据库,此处使用MySql数据库. 注意:文中给出的代码多为节选重要片段,并不齐全. 1. 前期准备 使用maven创建一个springMVC+spring+mybatis+mysql的项目

再谈web开中几种经典的大文件上传组件

1.aspnetupload 这是国人开发的一款收费.net控件,官网http://www.aspnetupload.net/ (不过也有一个免费版本的,允许上传10M内容,一般情况下也够了,收费版也不贵,大致就600 RMB) 它的大概原理是把文件分成一块一块的上传,然后客户端用ajax不断刷新从而显示进度条. 这也是我使用时间最长的一种解决方案,在IIS7出现以前完全没有任何问题,但IIS7及以上版本中,如果用了这个控件,应用程序池就只能运行在"经典"模式下,无法充分发挥IIS7的

struts2单个文件上传的两种实现方式_java

通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构 2.新建Action 第一种方式 复制代码 代码如下: package com.ljq.action; import java.io.File; import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext; import com.opensymph

Facebook可能从Messenger赚钱的两种方式

据<福布斯>网站报道,自从Facebook任命PayPal首席执行官大卫·马库斯(David Marcus)为其Messenger服务主管后,科技行业就对该公司将如何从Messenger应用中赚钱议论纷纷.<福布斯>杂志负责报道移动创新的记者帕米·奥尔森(Parmy Olson)认为,Facebook可能通过下面两种方式从Messenger服务上赚钱. 首先,Facebook可能推出现金转账服务,与马库斯前雇主PayPal直接竞争.4月福布斯证实,Facebook在开发一种泛欧服务

JavaBean实现多文件上传的两种方法

上传 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先讲述了http协议传送多个文件的基本格式和实现上传的详细过程,之后简单介绍了使用ftpclient 类实现了ftp方式的上传,最后对这两种方法进行了比较. 关键字:JavaBean .http .ftp .ftpclient JavaBean是一种基于Java的软件组件.JSP对于在Web 应用中集成JavaBean组件提供了完善的支持.这种支持不仅能缩短开发时间(可以直接利用经测试和可