`

SpringMVC上传文件的三种方式

阅读更多

  项目结构如下所示:

  upload.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>fileUpload</title>
	</head>
	<body>
		<form name="serForm" action="/SpringMVC/upload/fileUpload" method="post"  enctype="multipart/form-data">
			<h1>file stream upload:</h1>
			<input type="file" name="file">
			<input type="submit" value="upload"/>
		</form>
		 
		<form name="Form2" action="/SpringMVC/upload/fileUpload2" method="post"  enctype="multipart/form-data">
			<h1>multipart file.transfer upload:</h1>
			<input type="file" name="file">
			<input type="submit" value="upload"/>
		</form>
		 
		<form name="Form2" action="/SpringMVC/upload/springUpload" method="post"  enctype="multipart/form-data">
			<h1>spring mvc upload:</h1>
			<input type="file" name="file">
			<input type="submit" value="upload"/>
		</form>
	</body>
</html>

  UploadController.java

package com.bijian.study.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
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;

@Controller
@RequestMapping("/upload")
public class UploadController {

	/*
	 * 通过流的方式上传文件
	 * 
	 * @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
	 */
	@RequestMapping("/fileUpload")
	public String fileUpload(@RequestParam("file") CommonsMultipartFile file)
			throws IOException {

		// 用来检测程序运行时间
		long startTime = System.currentTimeMillis();
		System.out.println("fileName:" + file.getOriginalFilename());

		try {
			// 获取输出流
			OutputStream os = new FileOutputStream("E:/upload/" + new Date().getTime()
					+ file.getOriginalFilename());
			// 获取输入流 CommonsMultipartFile 中可以直接得到文件的流
			InputStream is = file.getInputStream();
			int temp;
			// 一个一个字节的读取并写入
			while ((temp = is.read()) != (-1)) {
				os.write(temp);
			}
			os.flush();
			os.close();
			is.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long endTime = System.currentTimeMillis();
		System.out.println("方法一的运行时间:" + String.valueOf(endTime - startTime) + "ms");
		return "/success";
	}

	/*
	 * 采用file.Transto 来保存上传的文件
	 */
	@RequestMapping("fileUpload2")
	public String fileUpload2(@RequestParam("file") CommonsMultipartFile file)
			throws IOException {
		long startTime = System.currentTimeMillis();
		System.out.println("fileName:" + file.getOriginalFilename());
		String path = "E:/upload/" + new Date().getTime() + file.getOriginalFilename();

		File newFile = new File(path);
		// 通过CommonsMultipartFile的方法直接写文件(注意这个时候)
		file.transferTo(newFile);
		long endTime = System.currentTimeMillis();
		System.out.println("方法二的运行时间:" + String.valueOf(endTime - startTime) + "ms");
		return "/success";
	}

	/*
	 * 采用spring提供的上传文件的方法
	 */
	@RequestMapping("springUpload")
	public String springUpload(HttpServletRequest request)
			throws IllegalStateException, IOException {
		long startTime = System.currentTimeMillis();
		// 将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		// 检查form中是否有enctype="multipart/form-data"
		if (multipartResolver.isMultipart(request)) {
			// 将request变成多部分request
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
			// 获取multiRequest 中所有的文件名
			Iterator iter = multiRequest.getFileNames();

			while (iter.hasNext()) {
				// 一次遍历所有文件
				MultipartFile file = multiRequest.getFile(iter.next()
						.toString());
				if (file != null) {
					String path = "E:/upload/springUpload" + file.getOriginalFilename();
					// 上传
					file.transferTo(new File(path));
				}

			}

		}
		long endTime = System.currentTimeMillis();
		System.out.println("方法三的运行时间:" + String.valueOf(endTime - startTime) + "ms");
		return "/success";
	}
}

  hbatis-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

	<!-- 注册RequestMappingHandlerMapping, RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver以提供对@RequestMapping,@ExceptionHandler等注解的支持 -->
	<mvc:annotation-driven />

	<!-- 扫描控制器包下有特定注解的类,并实例化和依赖注入 -->
	<context:component-scan base-package="com.bijian.study.controller" />

	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/pages/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>
	
	<!-- 多部分文件上传 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     	<property name="maxUploadSize" value="104857600" />
     	<property name="maxInMemorySize" value="4096" />
     	<property name="defaultEncoding" value="UTF-8"></property>
	</bean>
</beans>

  web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   
	<display-name>SpringMVC</display-name>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
		<!-- 监听容器事件,初始化和关闭Web应用上下文并调用ContextCleanupListener清理资源 -->
	</listener>
	<listener>
		<listener-class>org.springframework.web.context.ContextCleanupListener</listener-class>
		<!-- Web应用关闭时,清理ServletContext中spring相关的可销毁资源 -->
	</listener>

	<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>
		</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>
	</filter-mapping>
	
	<servlet>
	  <servlet-name>hbatis</servlet-name>
	  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	  <!--<init-param>
	    <param-name>contextConfigLocation</param-name>
	    <param-value>/WEB-INF/hbatis-servlet.xml</param-value>
	  </init-param>-->
	  <!-- 未配置时,SpringMVC会到WEB-INF目录下找${servlet-name}-servlet.xml -->
	  <load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
	  <servlet-name>hbatis</servlet-name>
    <url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>  

  打开http://localhost:8080/SpringMVC/upload.jsp上传页面,如下所示:


  我们看看测试上传的时间,第一次我用一个4M的文件,运行结果如下:

fileName:test.rar
方法一的运行时间:14712ms
fileName:test.rar
方法二的运行时间:5ms
方法三的运行时间:4ms

  第二次:我用一个50M的文件

方式一进度很慢,估计得要个5分钟
方法二的运行时间:67ms
方法三的运行时间:80ms

  从测试结果我们可以看到:用springMVC自带的上传文件的方法要快的多!

  对于测试二的结果:可能是方法三得挨个搜索,所以要慢点。不过一般情况下我们是方法三,因为他能提供给我们更多的方法。

 

PS:工程里需引入commons-fileupload和commons-io这两个jar包,在这里我用的是commons-fileupload-1.3.jar和commons-io-2.4.jar。

 

文章来源:https://www.cnblogs.com/fjsnail/p/3491033.html

  • 大小: 11.7 KB
  • 大小: 18.8 KB
分享到:
评论

相关推荐

    springMVC 上传文件方式

    springMVC 上传文件方式springMVC 上传文件方式springMVC 上传文件方式

    springmvc上传文件controller,vue

    同时,确保前端和后端的安全性,比如使用CSRF令牌防止跨站请求伪造,以及对上传文件进行适当的权限控制。 最后,项目中的"新建文件夹"可能表示在服务器端需要创建一个目录来存储上传的文件。你可以使用Java的`java....

    SpringMVC文件上传,多文件上传实例

    这个接口封装了上传文件的基本信息,如文件名、大小、内容等。在控制器方法中,我们可以声明一个`MultipartFile`参数来接收上传的文件。 3. **配置SpringMVC以支持文件上传**: 在SpringMVC的配置文件中,我们需要...

    SpringMVC上传文件的四种方法

    -- 设置最大上传文件大小 --&gt; ``` 在Controller中,同样可以使用`@RequestParam`接收文件: ```java @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file...

    SpringMVC上传文件 SSH上传文件

    本主题将深入探讨如何使用SpringMVC和SSH(Struts2 + Hibernate + Spring)框架来实现文件的上传与下载。 首先,我们来看SpringMVC中的文件上传。SpringMVC是Spring框架的一部分,它提供了强大的MVC设计模式支持,...

    尚硅谷SpringMVC上传文件

    在使用springMVC进行系统实现时,springMVC默认的解析器里面是没有加入对文件上传的解析的,这可以方便我们实现自己的文件上传。但如果你想使用springMVC对文件上传的解析器来处理文件上传的时候就需要在spring的...

    springMvc单文件多文件上传

    springMvc 文件上传,springMvc 支持单文件和多文件上传,

    Springmvc上传文件.docx

    SpringMVC 上传文件详解 SpringMVC 框架中上传文件是非常常见的操作,今天我们来详细讲解 SpringMVC 中的文件上传过程。 文件上传的必要条件 在 SpringMVC 中,文件上传需要满足以下几个条件: 1. 表单的 ...

    IDEA SpringMVC 实现文件的上传下载

    -- 指定最大上传文件大小 --&gt; ``` 3. **Controller层处理**: 创建一个Controller类,定义两个方法,分别处理文件上传和下载的请求。在上传方法中,通过`@RequestParam("file") MultipartFile file`接收上传...

    SpringMVC上传文件的三种方式.docx

    **第三种方式:使用Spring提供的上传文件方法** 这种做法不直接使用`CommonsMultipartFile`,而是通过`HttpServletRequest`获取上传的文件。具体步骤如下: 1. 通过`HttpServletRequest.getPart("file")`或`...

    springMVC上传文件demo

    springMVC上传文件的三种解析方式源码。可以添加到tomcat直接运行,运行访问地址为:http://localhost:8080/SpringMVCUploadFileDemo/upload/toUploadFileView1

    springMVC上传文件.zip_springmvc_上传文件_文件上传

    上传文件时要考虑安全性,包括防止文件覆盖、恶意文件上传(如脚本注入)、文件权限设置等。应验证文件类型、大小,并对文件名进行清理,避免特殊字符和路径遍历攻击。 9. **最佳实践** 使用流式处理文件,减少...

    SpringMVC单文件上传、多文件上传、文件列表显示、文件下载

    multipart请求是HTTP协议中用于上传文件的一种特殊类型,它可以包含多个部分,每个部分可以是一个表单字段或者一个文件。 **单文件上传** 对于单文件上传,我们需要在表单中添加`&lt;input type="file"&gt;`元素,然后在...

    springmvc上传文件到FTP

    结合这两者,我们可以创建一个功能,允许用户通过Web界面上传文件并将其存储在FTP服务器上。 首先,我们需要在`mmall.properties`配置文件中设置FTP服务器的相关信息,包括主机地址、端口号、用户名、密码以及目标...

    springmvc上传文件所需jar包

    在标题和描述中提到的"springmvc上传文件所需jar包"是指为了在Spring MVC应用中支持文件上传,开发者需要引入特定的Java Archive (JAR) 文件。以下是关于这两个关键JAR包的详细解释: 1. `...

    基于springmvc实现文件上传下载 基于AOP的日志功能

    基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...

    SpringMVC文件上传Demo代码

    在这个示例中,`@RequestParam("file") MultipartFile file`参数表示从请求中获取名为"file"的上传文件。如果文件不为空,代码会尝试读取文件内容并将其保存到服务器。如果在处理过程中出现异常,会返回错误信息。 ...

    springMVC多文件上传demo

    这通常在`WebMvcConfigurerAdapter`的`configureMultipartSettings`方法中完成,设置最大上传文件大小等相关参数。 5. **控制器方法** 控制器中需要定义一个接收`MultipartFile[]`类型的参数的方法,用于接收上传...

    SpringMVC+Ajax异步文件上传

    `SpringMVC`作为Java后端的一个强大框架,提供了处理文件上传的能力。而`Ajax`技术则使得页面可以在不刷新的情况下与服务器进行交互,实现异步上传,极大地提升了用户体验。在本教程中,我们将探讨如何结合`...

    springmvc带进度条上传源码

    在提供的"springmvc带进度条上传源码"中,可能包含了这些功能的实现,包括控制器、服务层、视图层以及前端的HTML、CSS和JavaScript文件。分析这些源码可以帮助你更好地理解文件上传和进度条显示的完整流程。如果你...

Global site tag (gtag.js) - Google Analytics