SpringMVC处理multipart请求的示例代码

一、简述

multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域。在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。类似这样:

二、 配置 multipart 解析器

尽管multipart请求看起来很复杂,但在Spring MVC中处理它们却很容易。在编写控制器方法处理文件上传之前,我们必须要配置一个multipart解析器,通过它来告诉DispatcherServlet该如何读取multipart请求。

Spring 内置了两个MultipartResolver的实现:

  1. CommonsMultipartResolver :使用Jakarta Commons FileUpload解析multipart请求;
  2. StandardServletMultipartResolver :依赖于Servlet 3.0对multipart请求的支持(始于Spring 3.1)。

StandardServletMultipartResolver的配置:

1、声明Bean:

在applicationContext.xml 配置

代码如下:

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver>

在配置类中配置

    @Bean(name = "multipartResolver")
    public StandardServletMultipartResolver getStandardServletMultipartResolver(){
        return new StandardServletMultipartResolver();
    }

tips:multipart解析器的命名一定要是 multipartResolver ,否则会报错。

2、配置上传参数:

* web.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:applicationContext.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  <multipart-config>
    <!--上传到/tmp/upload 目录-->
   <location>/tmp/upload</location>
    <!--文件大小为2M-->
   <max-file-size>2097152</max-file-size>
    <!--整个请求不超过4M-->
   <max-request-size>4194304</max-request-size>
    <!--所有文件都要写入磁盘-->
   <file-size-threshold>0</file-size-threshold>
  </multipart-config>
 </servlet>
 <servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

* 配置类中配置

继承 AbstractAnnotationConfigDispatcherServletInitializer 的配置类

  @Override
  protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    //上传到/tmp/upload 目录,文件大小为2M,整个请求不超过4M,而且所有文件都要写入磁盘
    registration.setMultipartConfig(new MultipartConfigElement("E:\\upload_ftp",2097152,4194304,0));
  }

CommonsMultipartResolver的配置:

1、声明Bean 和 配置上传参数

  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--设置上传目录/tmp/upload;最大的文件容量设置为2M;最大的内存大小设置为0,表示所有文件都会写入磁盘中;无法设定multipart请求整体的最大容量-->
    <property name="uploadTempDir" value="/tmp/upload"/>
    <property name="maxUploadSize" value="2097152"/>
    <property name="maxInMemorySize" value="0"/>
  </bean>

区别:

1、 CommonsMultipartResolver 相比较 StandardServletMultipartResolver 来说 就是无法设定multipart请求整体的最大容量。

2、 CommonsMultipartResolver 不会强制要求设置临时文件路径。默认情况下,这个路径就是 Servlet 容器的临时目录。 StandardServletMultipartResolver 必须设置临时文件路径才能正常执行。(以上所述上传目录均为临时文件路径)

三、SpringMVC 处理请求

1、前端Form 表单

   <form action="/picture" method="post" enctype="multipart/form-data">
     <input type="file" name="picture">
     <input type="submit">
   </form>

tips:需要设置   enctype="multipart/form-data",以告诉SpringMVC 这是一个Multipart 请求。

2、后端MVC接受请求

  @RequestMapping(value = "/picture",method = RequestMethod.POST)
  public String getHome(@RequestPart("picture") MultipartFile picture) throws IOException {
    String name = picture.getName();
    byte[] bytes = picture.getBytes();
    picture.transferTo(new File("/"+picture.getOriginalFilename()));
    //这里保存到文件系统的时候要用相对路径,比如这里配置的是 /。以配置的上传目录为基准。即文件路径 E:/upload_ftp/ 是保存的目录
    return "home";
  }

tips:1、@RequestPart("picture") : 当注册表单提交的时候,p icture 属性将会给定一个 byte 数组,这个数组中包含了请求中对应 part 的数据(通过 @RequestPart 指定)。如果用户提交表单的时候没有选择文件,那么这个数组会是空(而不是 null )。所以说我们甚至可以用byte[]数组接收Multipart请求而不用  MultipartFile。

2、MultipartFile :用MultipartFile方法接收为我们提供了很多的方法以便进行接下来的工作...

3、 以 Part的形式接受上传的文件

就主体来言, Part 接口与 MultipartFile 并没有太大的差别。  在很多情况下, Part 方法的名称与 MultipartFile 方法的名称是完全相同的。有一些比较类似,但是稍有差异,比如 getSubmittedFileName() 对应于 getOriginalFilename() 。类似地, write() 对应于 transferTo() ,借助该方法我们能够将上传的文件写入文件系统中。

值得一提的是,如果在编写控制器方法的时候,通过Part参数的形式接受文件上传,那么就没有必要设置MultipartResolver 了。只有使用MultipartFile的时候,我们才需要MultipartResolver。

  @RequestMapping(value = "/picture",method = RequestMethod.POST)
  public String getHome(@RequestPart("picture") Part picture) throws IOException {
    picture.write("/"+picture.getSubmittedFileName());
    return "home";
  }

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

(0)

相关推荐

  • 解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    有时在Spring MVC中返回JSON格式的response的时候会使用@ResponseBody注解,不过在处理java8中时间的时候会很麻烦,一般我们使用的HTTPMessageConverter是MappingJackson2HttpMessageConverter,它默认返回的时间格式是这种: "startDate" : { "year" : 2010, "month" : "JANUARY", "dayO

  • springmvc处理异步请求的示例

    springmvc 3.2开始就支持servlet3.0的异步请求.平常我们请求一个controller一般都是同步的,如果在代码执行中,遇到耗时的业务操作,那servlet容器线程就会被锁死,当有其他请求进来的时候就会受堵了. springmvc3.2之后支持异步请求,能够在controller中返回一个Callable或者DeferredResult.当返回Callable的时候,大概的执行过程如下: 当controller返回值是Callable的时候,springmvc就会启动一个线程将

  • JavaWeb项目中springmvc和tomcat对静态文件的处理

    1.激活Tomcat的defaultServlet来处理静态文件,web.xml配置 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> a.说到了这里另外说说url-pattern的配置 <!--url-pattern的三种写法--> <!--精确匹配:以&

  • springMVC图片上传的处理方式详解

    本文实例为大家分享了springMVC图片上传的处理方式,供大家参考,具体内容如下 首先需要依赖的jar包: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>

  • springmvc处理响应数据的解析

    1. ModelAndView 相关的成员变量和方法 private Object view; 描述视图信息 private ModelMap model 描述模型数据(响应数据) public void setViewName(String viewName) 设置视图信息 public ModelAndView addObject(String attributeName, Object attributeValue) 设置模型数据 protected Map<String, Object>

  • 基于SpringMVC的全局异常处理器介绍

    近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestMapping.@Autowared.@Component,今天呢,我所要写的是SpringMVC的全局异常处理器,关联的接口有HandlerExceptionResolver(Eclipse用户可以按Ctrl+Shift+T进行搜索该接口),什么是全局异常处理器?为什么要用它呢? 在企业开发中,各种

  • SpringMvc+POI处理excel表数据导入

    一.概念介绍 ApachePOI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能 二.功能相关代码 1.环境说明:JDK1.7+tomcat7+spring 2.配置文件的配置 pom文件中添加POI所需依赖 <!-- 添加POI支持 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&l

  • SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/*.js"/> <mvc:resources location="/" mapping=&quo

  • SpringMVC处理Form表单实例

    Spring MVC 表单处理例子下面的例子说明了如何编写一个简单的基于 web 的应用程序,它利用了使用 Spring 的 Web MVC 框架的 HTML 表单. 一 测试项目搭建 (1)新建Java Web项目,并引入几个SpringMVC项目所需要的jar包,项目结构和所需要的jar包如下: ①web.xml: <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3

  • Springmvc ajax跨域请求处理方法实例详解

    上次给一个网站写网站  前后端分离 最后跪在ajax跨域上面了  自己在网上找了个方法  亲试可用  记录一下 写一个类  继承HandlerInterceptorAdapter package com.util; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.Ha

随机推荐