`
Adan-Chiu
  • 浏览: 21685 次
社区版块
存档分类
最新评论

Spring MVC组件开发-文件上传

 
阅读更多

     在应用系统中,文件上传是非常常用的系统功能,spring mvc为上传文件提供了良好的支持。首先spring mvc的文件上传是通过MultipartResolver(Multipart解析器)处理的,对于MultipartResolver而言它只是一个接口,它有两个实现类。

  • CommonsMultipartResolver:依赖于Apache下的fileupload项目解析Multipart请求。需要依赖第三方包。
  • StandardServletMultipartResolver:依赖于Servlet3.0或者更高版本。不用依赖于第三方包。spring 3.1后支持。

StandardServletMultipartResolver上传

java配置MultipartResolver

@Bean
public MultipartResolver multipartResolver() {
	return new StandardServletMultipartResolver();
}

        StandardServletMultipartResolver构造方法没有参数,很容易进行实例化,这样通过@Bean注解便可以了,需要注意的是,没有给Bean指定名称,那么默认会以方法名作为Bean的名称,multipartResolver是是spring约定好的Bean name,不可以更改,如果方法名不一致,需要指定@Bean(name = "multipartResolver")。有时候还要对上传文件进行配置,比如限制单个文件的大小,设置上传文件的路径等等。

        StandardServletMultipartResolver需要通过servlet容器配置启用servlet 3.0 multipart解析,分析servlet3.0规范允许没有web.xml配置,只需要使用注解就可以了。spring3.1之后的版本也提供了注解方式的配置, 该方式需要继承AbstractAnnotationConfigDispatcherServletInitializer类,然后实现它所定义的方法。

package com.wise.tiger;

import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import com.wise.tiger.config.RootConfig;
import com.wise.tiger.config.Swagger2Config;
import com.wise.tiger.config.WebConfig;

/**
 * servlet3.0规范允许没有web.xml配置,只需要使用注解就可以了
 * spring3.1之后的版本也提供了注解方式的配置
 * 该方式需要继承AbstractAnnotationConfigDispatcherServletInitializer类,然后实现它所定义的方法。
 * @Description: 
 * @author: <a href="mailto:1020zhaodan@163.com">Adan</a> 
 * @date: 2019年5月28日  上午9:43:01
 * @version:1.0-snapshot
 * servlet3.0之后的版本允许动态加载servlet,只是按照规范需要实现ServletContainerInitializer接口。
 * 于是spring mvc在自己的包内实现了一个类SpringServletContainerInitializer,它实现了ServletContainerInitializer接口,
 *     这样就能够通过它去加载我们提供的WebAppInitializer类
 */
public class WebAppInitializer  extends AbstractAnnotationConfigDispatcherServletInitializer{
	/**
	 * Spring IoC(root)容器配置
	 */
	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class<?>[] {RootConfig.class};
	}

	/**
	 * DispatcherServlet的URI映射关系配置
	 */
	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class<?>[] {WebConfig.class,Swagger2Config.class};
	}
	
	/**
	 * dispatcherServlet 拦截内容(什么请求交给前端控制器)
	 * <url-pattern>/</url-pattern>
	 */
	@Override
	protected String[] getServletMappings() {
		return new String[] {"/"};
	}

	/**
	 * 添加过滤器Filter
	 */
	@Override
	protected Filter[] getServletFilters() {
		return new Filter[] {
				new CharacterEncodingFilter("UTF-8", true, true)//spring提供的字符编码过滤器
			};
	}

	/**
	 * 配置文件上传的相关属性,文件上传路径需要在程序中指定服务器的真实路径
	 * @param registration Servlet动态加载配置
	 */
	@Override
	protected void customizeRegistration(Dynamic registration) {
		//设置允许上传的单个文件大小 5M
		var singleMax = 5 * 1024 * 1024;
		//设置允许上传的总文件大小 20M
		var totalMax = 20 * 1024 * 1024;
        registration.setMultipartConfig(
        		new MultipartConfigElement(null,singleMax,totalMax,0));
	}
	
}
 如果采用xml配置,如下:
<servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <multipart-config>
        	<location>/</location>
        	<max-file-size>10485760</max-file-size>
        	<max-request-size>5242880</max-request-size>
        	<file-size-threshold>0</file-size-threshold>
        </multipart-config>
</servlet>
 

 

location 上传文件所存放的临时目录。必须指定
max-file-size 文件的最大大小,单位为字节。默认没有限制
max-request-size 请求的最大大小,单位为字节。默认没有限制
file-size-threshold 文件大小阈值,当大于这个阈值时将写入到磁盘,否则在内存中。默认值为0

 

提交上传文件表单

       一般而言,文件提交会以POST请求为主,要把enctype定义为"multipart/form-data",否则会解析失败

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加图书</title>	
</head>
<body>
    <form action="${pageContext.request.contextPath }/control/book/save" method="post" enctype="multipart/form-data">    
	图书封面:<input type="file" name="faceImage"  onchange="showImage(this)"/><br/>      
      <input type="submit" value="提交" /> 
    </form>
    
</body>
</html>
 为此开发一个Controller,用于处理各种文件

 

 

@Controller
@RequestMapping("control/book")
public class BookController {
	@Autowired private BookService service;
	/**
	 * 上传文件
	 * @param faceImage 请求上传的文件spring MVC通过MultipartFile进行封装获取
	 */
	@RequestMapping("/save")
	public String save(MultipartFile faceImage) throws IllegalStateException, IOException {
		//获取绑定在当前线程上的请求对象
		var request =( (ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
		//将上传的文件上传至服务器中真实路径
		var realpath = request.getServletContext().getRealPath("/images");
		//如果文件目录不存在就创建
		var dirFile = new File(realpath);
		if(!dirFile.exists())dirFile.mkdirs();
		//获取上传的文件名
		var filename = faceImage.getOriginalFilename();
		//目标文件
		var dest = new File(dirFile,filename);
		//保存文件
		faceImage.transferTo(dest);
		return "file_list";
	}
}
 

 

使用CommonsMultipartResolver进行文件上传

         步骤一致,代码也一致,看看配置,该上传需要依赖第三方jar包,所以先添加依赖

 

compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.4'
 配置:

 

 

@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
	// 设置允许上传的单个文件大小 5M
	var singleMax = 5 * 1024 * 1024;
	// 设置允许上传的总文件大小 20M
	var totalMax = 20 * 1024 * 1024;
	var filepath = "/";//文件上传路径,一般在程序中指定为服务器的真实路径
	var multipartResolver = new CommonsMultipartResolver();
	multipartResolver.setMaxUploadSizePerFile(singleMax);
	multipartResolver.setMaxUploadSize(totalMax);
	try {
		multipartResolver.setUploadTempDir(new FileSystemResource(filepath));
	} catch (IOException e) {
		e.printStackTrace();
	}
	return multipartResolver;
}
 其它处理方式一致,下面介绍xml方式配置multipartResolver

 

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 最大允许上传大小5MB -->
     <property name="maxUploadSize" value="5242880" />
     <property name="maxInMemorySize" value="4096" />
     <property name="defaultEncoding" value="UTF-8"></property>
 </bean>
 
分享到:
评论

相关推荐

    Spring MVC step-by-step 源码

    在MyEclipse环境下开发的"springapp"项目,涵盖了Spring MVC的基础配置和核心组件。以下将详细解释这个项目中的关键知识点: 1. **项目结构**: - `src/main/java`:包含所有Java源代码,如控制器(Controller)、...

    translation-spring-mvc-4-documentation, Spring MVC 4.2.4 RELEASE 中文文档完整翻译稿.zip

    除此之外,Spring MVC还支持RESTful风格的URL设计、文件上传下载、异常处理、视图解析以及模板引擎集成(如JSP、Thymeleaf等)。这个翻译文档详细阐述了这些特性,并提供了丰富的示例代码,对于学习和掌握Spring MVC...

    Spring MVC--------我在创智软件的面试

    使用MultipartFile处理文件上传,通过StreamingResponseBody处理大文件下载,Spring MVC提供了便捷的API来处理这些常见需求。 13. **整合其他Spring模块**: Spring MVC可以与Spring的其他模块,如Spring ...

    SpringMVC源码总结(二)mvc:mvc:annotation-driven背后的那些事

    Spring MVC会自动配置`CommonsMultipartResolver`来支持文件上传。 8. **RESTful支持**:`mvc:annotation-driven`还支持RESTful风格的HTTP方法,如GET、POST、PUT、DELETE等,以及HTTP头的处理。 9. **国际化**:...

    spring-mvc-04-master.zip

    2. 文件上传下载:Spring MVC提供API支持文件上传和下载功能。 3. 异常处理:自定义异常处理器,统一处理应用中的异常情况。 4. 国际化:支持多语言环境,提高应用的全球化适应性。 5. RESTful API设计:Spring MVC...

    Spring MVC 文件上传下载 后端 - Java.zip

    在Spring MVC框架中,文件上传和下载是常见的功能需求,特别是在构建Web应用程序时。这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于...

    Spring2.5MVC--基于注解的附件上传

    总之,"Spring2.5 MVC -- 基于注解的附件上传"是一个关于如何在Spring MVC 2.5中利用注解方便地处理文件上传的教程。通过阅读这篇博客,开发者可以学习到如何配置`MultipartResolver`,以及如何在控制器中使用`@...

    Spring-MVC-step-by-step2.rar

    这个过程会涵盖文件上传、日期格式化、国际化支持等常见功能。 在源码分析部分,我们会深入到Spring MVC的源代码,了解如HandlerMapping、HandlerAdapter、ViewResolver等核心接口和类的工作流程,这对于优化性能和...

    spring-mvc开发所有jar包【4.3.4】

    这些jar包组合在一起,为开发者提供了完整的Spring MVC开发环境,涵盖了从Web请求处理到数据库操作的各个层面。在非Maven项目中,只需将这些jar包引入类路径,就可以快速搭建起一个功能强大的Spring MVC应用。同时,...

    spring-mvc-step-by-step

    开始学习前,你需要配置Java开发环境、Maven或Gradle构建工具,以及Spring Boot或者独立的Spring MVC项目结构。教程会指导你如何设置相关的依赖和配置文件。 3. **Controller概念** Controller是Spring MVC的核心...

    spring-mvc-documentation-linesh-translation

    根据提供的文件信息,我们可以将其中的关键知识点归纳如下: ### Spring MVC 框架简介 ...通过对上述知识点的学习和理解,可以更好地掌握 Spring MVC 的使用方法,进而开发出更加优秀的 Web 应用程序。

    ssm框架--spring mvc实现文件上传

    SSM框架,全称Spring、Spring MVC和MyBatis,是Java Web开发中常见的三大组件。Spring作为核心容器,管理着应用对象的生命周期和依赖注入;Spring MVC是Spring的Web模块,负责处理HTTP请求和响应;MyBatis则是一个...

    Spring-Spring mvc-MyBatis

    Spring MVC作为Spring框架的一个子项目,专注于Web应用的开发,提供了一种清晰的模型-视图-控制器(MVC)设计模式实现。它主要负责处理HTTP请求,并将请求分发到合适的控制器(Controller)上进行处理。Spring MVC的特点...

    Spring MVC所需jar包

    6. **Apache Commons**:Spring MVC 开发中可能会用到 Apache Commons 的一些工具库,例如 `commons-logging.jar` 用于日志记录,`commons-fileupload.jar` 用于文件上传,`commons-lang3.jar` 提供了一些实用的 ...

    spring-webmvc-4.08jar包及相关jar包

    10. **上传文件**:Spring MVC提供了一个MultipartFile接口,可以方便地处理文件上传操作。 11. **RESTful支持**:Spring MVC支持创建RESTful风格的Web服务,通过@RequestMapping注解的HTTP方法属性,可以轻松实现...

    Spring mvc 教程

    - **Servlet 3.0 下的 MultipartResolver**:对于 Servlet 3.0 及以上版本,Spring MVC 提供了内置的文件上传支持。 - **处理表单中的文件上传**:通过控制器方法来接收和处理上传的文件。 #### 异常处理 ...

    spring mvc 文件上传 代码完整版

    在Spring MVC中实现文件上传,首先需要在`web.xml`配置文件中添加MultipartResolver,通常是`CommonsMultipartResolver`,这是Spring MVC处理文件上传的关键组件。它依赖于Apache Commons FileUpload库,需要将其...

    精通Spring MVC4

    使用MultipartFile处理文件上传,而HttpServletResponse则可以用来处理文件下载。Spring MVC提供了便捷的API来处理这些场景。 10. **RESTful服务** Spring MVC通过@RequestMapping的produces和consumes属性,以及...

    Spring,Spring MVC所需的jar包

    Spring 和 Spring MVC 是Java开发中广泛使用的两大框架,它们为构建高效、可维护的企业级应用程序提供了强大的支持。这些jar包是实现Spring和Spring MVC功能的基础组件,下面将逐一解析每个jar包及其在整体架构中的...

    文件上传下载(maven + spring mvc + jetty)

    在文件上传下载的场景中,Spring MVC的Controller组件负责接收HTTP请求,处理文件上传和下载操作,Service层处理业务逻辑,而DAO层则与数据库交互,存储或读取文件元数据。 文件上传在Spring MVC中主要通过`@...

Global site tag (gtag.js) - Google Analytics