前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC处理multipart请求.

SpringMVC处理multipart请求.

作者头像
JMCui
发布2018-03-15 17:24:35
1.5K0
发布2018-03-15 17:24:35
举报
文章被收录于专栏:JMCuiJMCuiJMCui

一、简述

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

二、配置multipart解析器

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

   Spring 内置了两个MultipartResolver的实现:

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

1、StandardServletMultipartResolver的配置:

 (1) 声明Bean:

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

    * 配置类中配置

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

2、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>

3、区别:

(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(),借助该方法我们能够将上传的文件写入文件系统中。

       值得一提的是,如果在编写控制器方法的时候,通过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";
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简述
  • 二、配置multipart解析器
  • 三、SpringMVC 处理请求
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档