SpringMVC处理multipart请求.

一、简述

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

二、配置multipart解析器

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

Spring 内置了两个MultipartResolver的实现:

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

StandardServletMultipartResolver的配置:

1、声明Bean:

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

在applicationContext.xml 配置

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

* 配置类中配置

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

继承 AbstractAnnotationConfigDispatcherServletInitializer 的配置类

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>

在applicationContext.xml中设置

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

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

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

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

原文地址:https://www.cnblogs.com/jmcui/p/8179174.html

时间: 2025-01-17 10:22:04

SpringMVC处理multipart请求.的相关文章

《Spring实战》读书笔记--SpringMVC处理Multipart数据

<Spring实战>读书笔记--SpringMVC处理Multipart数据 1.Multipart介绍 1.1 Multipart形式的数据 Multipart格式数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域.在一般的表单输入域中,它对应的部分会放置文本型数据,如果是文件上传形式,它对应的部分可以是二进制. 1.2 Multipart/form-data请求方式 Multipart/form-data是建立在HTTP的POST请求方式以上的请求,其一般用于HTTP文件上

SpringMVC经典系列-13使用SpringMVC处理Ajax请求---【LinusZhu】

注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系[email protected],敬请朋友们斧正,谢谢. 这一部分主要讲解SpringMVC如何处理Ajax请求,是首先要讲解一下jackson类库,可以帮助我们在java对象和json.xml数据之间的互相转换.他可以将控制器返回的对象直接转换成json数据,供客户端使用,客户端也可以传送json数据到服务

SpringMVC的AJAX请求报406错误

SpringMVC的AJAX请求报406错误原因有两种:1.jackson包没有引入 2.如果已经引入jackson包了还报406的错误,那么就有可能是请求的url路径是.html结尾,但是返回的数据是一个对象,这时浏览器就不知道怎么响应了,因为一般请求.html后缀的页面,返回的一般是个字符串或者页面内容,此时可以在web.xml中再配置一个拦截后缀,如*.action,web.xml可以有多个拦截后缀,请求.action的后缀,浏览器就没有这个限制了

springMVC带参数请求重定向

SpirngMVC返回逻辑视图名 可以分下面几种情况: 1. servlet进行请求转发,返回到jsp页面,如  return "index.jsp" ; 2. servlet 返回结果,让请求 重定向到某个jsp页面 ,此时servlet 返回语句类似:  return  " redirect : index.jsp "; 3. servlet 的返回结果是 请求另外一个servlet   此时servlet 返回语句类似:  return  " red

Springmvc之接受请求参数二

Springmvc之接受请求参数 准备工作 新建一个表单提交 请求地址: http://localhost:8080/ProjectName/user/login.do <form action="<%=request.getContextPath()%>/user/login.do" method="post"> username:<input type="text" name="username&quo

springMVC将post请求转为delete/put请求

需要在web.xml文件配置<!--将POST请求转化为DELETE或者是PUT要用_method指定真正的请求参数--><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter> <

springMVC 解决ajax请求的406错误

直入主题-- 页面表单异步提交:$.post('<%=request.getContextPath()%>/web/register.html', $(form).serialize(), function(data){...}); java后台springMVC的controller接受请求: @RequestMapping("register") @ResponseBody public Map<String, String> register(HttpSe

springmvc的POST 请求转为 DELETE 或 put 请求配置HiddenHttpMethodFilter

1.web.xml里配置 <!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter: 可以把 POST 请求转为 DELETE 或 put 请求 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpM

SpringMVC简单映射请求参数介绍

1. @RequestMapping @RequestMapping除了修饰方法, 还可来修饰类 1). 类定义处: 提供初步的请求映射信息.相对于 WEB 应用的根目录 2). 方法处: 提供进一步的细分映射信息. 相对于类定义处的 URL.若类定义处未标注 @RequestMapping,则方法处标记的 URL相对于 WEB 应用的根目录 @RequestMapping("/testRequestMapping") public String testRequestMapping(