一、简述

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

在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 的配置类

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>

在applicationContext.xml中设置

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";
}

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

  1. SpringMVC实现PUT请求上传文件

    在JQuery中,我们可以进行REST ful中delete和put的请求,但是在java EE标准中,默认只有在POST请求的时候,servlet 才会通过getparameter()方法取得请求体 ...

  2. Spring 梳理-处理Multipart 请求

    原理讲解 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form method="post"actio ...

  3. SpringMVC处理客户端请求的过程

    SpringMVC处理客户端请求的过程 以程序部署在Tomcat上为例,网站程序使用SpringMVC框架开发. 1.客户端发起一个访问网站的请求(如: localhost:8080/index). ...

  4. springmvc国际化 基于请求的国际化配置

    springmvc国际化 基于请求的国际化配置 基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主. 项目结构图: 说明:properties文件中为国际化资源文件.格式相关 ...

  5. SpringMVC中post请求参数注解@requestBody使用问题

    一.httpClient发送Post 原文https://www.cnblogs.com/Vdiao/p/5339487.html public static String httpPostWithJ ...

  6. Springmvc之接受请求参数二

    Springmvc之接受请求参数 准备工作 新建一个表单提交 请求地址: http://localhost:8080/ProjectName/user/login.do <form action ...

  7. springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...

  8. SpringMVC的AJAX请求报406错误

    SpringMVC的AJAX请求报406错误原因有两种:1.jackson包没有引入 2.如果已经引入jackson包了还报406的错误,那么就有可能是请求的url路径是.html结尾,但是返回的数据 ...

  9. SpringMVC响应Ajax请求(@Responsebody注解返回页面)

    项目需求描述:page1中的ajax请求Controller,Controller负责将service返回的数据填充到page2中,并将page2整个页面返回到page1中ajax的回调函数. 一句话 ...

随机推荐

  1. Play-With-Docker在chrome上的插件

    一键使用PWD 在chrome扩展中,找到"Play With Docker"插件,并安装在chrome浏览器中 进入hub.docker.com网站,搜索熟悉的docker镜像. ...

  2. OCPC(Optimized Cost per Click)机制

    背景 在线广告中,广告按照CPM排序,排在前面的广告竞争有限广告位(截断).其中,CPM=bid*pctr.注GSP二价计费的,按照下一位bid计费.适当调整bid,可以提高竞价的排名,从而获得展现的 ...

  3. JavaScript练习网站收集

    在学习的过程中会发现很多知识点如果不在工作中运用或者手写带验证的话,很容易忘记.任何技能的掌握都是需要不断练习的.在此收集一些自己遇到的JavaScript练习的网站. codewars 国外的一个练 ...

  4. Cesium基础使用介绍

    前言 最近折腾了一下三维地球,本文简单为大家介绍一款开源的三维地球软件--Cesium,以及如何快速上手Cesium.当然三维地球重要的肯定不是数据显示,这只是数据可视化的一小部分,重要的应该是背后的 ...

  5. POJ 1273 Drainage Ditches 网络流 FF

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 74480   Accepted: 2895 ...

  6. nanomsg 如何写数据到PipelineDB

    nanomsg:https://github.com/nanomsg/nanomsg PipelineDB:https://github.com/pipelinedb/pipelinedb nanom ...

  7. C# DateDateTimePicker设置属性ShowCheckBox为True

    DateDateTimePicker的属性ShowCheckBox为True后,可以使用时间控件的复选框. 但是如果,你想设置CheckBox的选中状态为False的话,那么请注意赋时间值和赋状态值的 ...

  8. DEBUG技巧-设定合适的日志级别

    有些技能只有踩过坑的人才能够掌握,能用来避免后来的坑,很多时候是用凌晨的时间换来的,我们通常把他叫做经验. 故事 这个一个关于springmvc的坑的故事. 某天晚上本打算一个小功能分分钟搞定上线,但 ...

  9. 关于Mac终端故障一直出现 [进程已完毕]

    终端已打开就出现以下信息.无法输入不论什么的命令 Last login: Mon Aug 18 10:00:36 on ttys000 [进程已完毕] 原因:不知谁改动了 终端->偏好设置-&g ...

  10. (转)rabbitMQ基础知识及命令语句

    摘要: 整理rabbitmq的用户管理相关知识,备忘 安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. ...