在应用系统中,文件上传是非常常用的系统功能,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
相关推荐
在MyEclipse环境下开发的"springapp"项目,涵盖了Spring MVC的基础配置和核心组件。以下将详细解释这个项目中的关键知识点: 1. **项目结构**: - `src/main/java`:包含所有Java源代码,如控制器(Controller)、...
除此之外,Spring MVC还支持RESTful风格的URL设计、文件上传下载、异常处理、视图解析以及模板引擎集成(如JSP、Thymeleaf等)。这个翻译文档详细阐述了这些特性,并提供了丰富的示例代码,对于学习和掌握Spring MVC...
使用MultipartFile处理文件上传,通过StreamingResponseBody处理大文件下载,Spring MVC提供了便捷的API来处理这些常见需求。 13. **整合其他Spring模块**: Spring MVC可以与Spring的其他模块,如Spring ...
Spring MVC会自动配置`CommonsMultipartResolver`来支持文件上传。 8. **RESTful支持**:`mvc:annotation-driven`还支持RESTful风格的HTTP方法,如GET、POST、PUT、DELETE等,以及HTTP头的处理。 9. **国际化**:...
2. 文件上传下载:Spring MVC提供API支持文件上传和下载功能。 3. 异常处理:自定义异常处理器,统一处理应用中的异常情况。 4. 国际化:支持多语言环境,提高应用的全球化适应性。 5. RESTful API设计:Spring MVC...
在Spring MVC框架中,文件上传和下载是常见的功能需求,特别是在构建Web应用程序时。这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于...
总之,"Spring2.5 MVC -- 基于注解的附件上传"是一个关于如何在Spring MVC 2.5中利用注解方便地处理文件上传的教程。通过阅读这篇博客,开发者可以学习到如何配置`MultipartResolver`,以及如何在控制器中使用`@...
这个过程会涵盖文件上传、日期格式化、国际化支持等常见功能。 在源码分析部分,我们会深入到Spring MVC的源代码,了解如HandlerMapping、HandlerAdapter、ViewResolver等核心接口和类的工作流程,这对于优化性能和...
这些jar包组合在一起,为开发者提供了完整的Spring MVC开发环境,涵盖了从Web请求处理到数据库操作的各个层面。在非Maven项目中,只需将这些jar包引入类路径,就可以快速搭建起一个功能强大的Spring MVC应用。同时,...
开始学习前,你需要配置Java开发环境、Maven或Gradle构建工具,以及Spring Boot或者独立的Spring MVC项目结构。教程会指导你如何设置相关的依赖和配置文件。 3. **Controller概念** Controller是Spring MVC的核心...
根据提供的文件信息,我们可以将其中的关键知识点归纳如下: ### Spring MVC 框架简介 ...通过对上述知识点的学习和理解,可以更好地掌握 Spring MVC 的使用方法,进而开发出更加优秀的 Web 应用程序。
SSM框架,全称Spring、Spring MVC和MyBatis,是Java Web开发中常见的三大组件。Spring作为核心容器,管理着应用对象的生命周期和依赖注入;Spring MVC是Spring的Web模块,负责处理HTTP请求和响应;MyBatis则是一个...
Spring MVC作为Spring框架的一个子项目,专注于Web应用的开发,提供了一种清晰的模型-视图-控制器(MVC)设计模式实现。它主要负责处理HTTP请求,并将请求分发到合适的控制器(Controller)上进行处理。Spring MVC的特点...
6. **Apache Commons**:Spring MVC 开发中可能会用到 Apache Commons 的一些工具库,例如 `commons-logging.jar` 用于日志记录,`commons-fileupload.jar` 用于文件上传,`commons-lang3.jar` 提供了一些实用的 ...
10. **上传文件**:Spring MVC提供了一个MultipartFile接口,可以方便地处理文件上传操作。 11. **RESTful支持**:Spring MVC支持创建RESTful风格的Web服务,通过@RequestMapping注解的HTTP方法属性,可以轻松实现...
- **Servlet 3.0 下的 MultipartResolver**:对于 Servlet 3.0 及以上版本,Spring MVC 提供了内置的文件上传支持。 - **处理表单中的文件上传**:通过控制器方法来接收和处理上传的文件。 #### 异常处理 ...
在Spring MVC中实现文件上传,首先需要在`web.xml`配置文件中添加MultipartResolver,通常是`CommonsMultipartResolver`,这是Spring MVC处理文件上传的关键组件。它依赖于Apache Commons FileUpload库,需要将其...
使用MultipartFile处理文件上传,而HttpServletResponse则可以用来处理文件下载。Spring MVC提供了便捷的API来处理这些场景。 10. **RESTful服务** Spring MVC通过@RequestMapping的produces和consumes属性,以及...
Spring 和 Spring MVC 是Java开发中广泛使用的两大框架,它们为构建高效、可维护的企业级应用程序提供了强大的支持。这些jar包是实现Spring和Spring MVC功能的基础组件,下面将逐一解析每个jar包及其在整体架构中的...
在文件上传下载的场景中,Spring MVC的Controller组件负责接收HTTP请求,处理文件上传和下载操作,Service层处理业务逻辑,而DAO层则与数据库交互,存储或读取文件元数据。 文件上传在Spring MVC中主要通过`@...