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

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

1.Multipart介绍



1.1 Multipart形式的数据

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

1.2 Multipart/form-data请求方式

Multipart/form-data是建立在HTTP的POST请求方式以上的请求,其一般用于HTTP文件上传。

所以我们需要在表单(form)元素中如下设置,使得该表单请求用于处理文件:

1 <form class="" action="" method="post" enctype="multipart/form-data">

2.SpringMVC处理Multipart数据



2.1 配置Multipart解析器

DispatcherServlet没有实现解析multipart请求数据的功能。它将任务委托给Spring中MutipartResolver策略接口实现,通过这个实现类来解析multipart请求中的内容。Spring3.1后内置两个MultipartResolver的实现供我们选择:

  • CommonsMultipartResolver: 使用Jakarta Commons FileUpload解析multipart请求。
  • StandardServletMultipartResolver: 依赖于Servlet3.0对multipart请求的支持。

一.使用CommonsMultipartResolver解析器

因为CommonsMultipartResolver依赖于Apache Commons FileUpload,所以我们需要引入commons-fileupload

1 <dependency>
2     <groupId>commons-fileupload</groupId>
3     <artifactId>commons-fileupload</artifactId>
4     <version>1.3.1</version>
5 </dependency>

在SpringMVC配置文件中装载Bean即可,通过注入相关属性设置参数。

1 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
2     <property name="defaultEncoding" value="utf-8" />
3     <property name="maxUploadSize" value="1024000" />
4     <property name="maxInMemorySize" value="204800" />
5     <property name="uploadTempDir" value="/" />
6 </bean>

相关属性说明

属性名 说明
defaultEncoding 默认的解析编码,默认为iso-8859-1
maxUploaadSize 上传文件的最大大小,默认为-1(无限制)
maxInMemorySize 内存缓冲区大小,超过时写入硬盘,默认为-1(无限制)
uploadTempDir  临时文件目录,默认是serlvet容器的临时目录

二.使用StandardServletMultipartResolver解析器

在SpringMVC配置文件中装载Bean

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

因为StandardServletMultipartResolver解析使用Servlet的处理Multipart方法处理,所以我们需要在web.xml中设置DispatcherServlet时设置相关属性

 1 <servlet>
 2     <servlet-name>useSpringMVC-dispatcher</servlet-name>
 3     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 4     <init-param>
 5         <param-name>contextConfigLocation</param-name>
 6         <param-value>classpath:spring/spring-*.xml</param-value>
 7     </init-param>
 8     <load-on-startup>1</load-on-startup>
 9     <multipart-config>
10         <location>/</location>
11         <max-file-size>102400</max-file-size>
12         <max-request-size>204800</max-request-size>
13         </multipart-config>
14 </servlet>

相关属性说明

属性名 说明
location 上传文件所存放的临时目录。必须指定
max-file-size 文件的最大大小,单位为字节。默认没有限制
max-request-size 请求的最大大小,单位为字节。默认没有限制)
file-size-threshold  文件大小阈值,当大于这个阈值时将写入到磁盘,否则在内存中。默认值为0

2.2 处理multipart请求

一.Spring提供了MutilpartFile接口处理Mutilpart数据。接口API如下:

 1 public interface MultipartFile {
 2     /**
 3     * 返回表单中mutilpart数据的名字
 4     */
 5     String getName();
 6     /**
 7     * 返回该文件名
 8     */
 9     String getOriginalFilename();
10
11
12     boolean isEmpty();
13
14
15     byte[] getBytes() throws IOException;
16
17     InputStream getInputStream() throws IOException;
18     /**
19     * 把MultipartFile接口对象转换为File对象
20     */
21     void transferTo(File dest) throws IOException, IllegalStateException;
22 }

二.控制器处理multipart请求

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html lang="zh-cn">
 5 <head>
 6 <meta charset="UTF-8">
 7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 8 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 9 <link rel="stylesheet"
10     href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
11 <title>File Upload</title>
12 </head>
13 <body>
14     <div class="container">
15         <div style="padding-top: 200px"></div>
16         <div class="row">
17             <div class="col-md-4"></div>
18             <div class="col-md-5">
19                 <div class="panel panel-default" >
20                     <div class="panel-heading text-center">
21                         <h2>文件上传</h2>
22                     </div>
23                     <div class="panel-body">
24                         <form class="form-horizontal" role="form" action="/springMVC/upload" method="post" enctype="multipart/form-data">
25                             <div class="form-group">
26                                 <label class="col-sm-3 text-center">文 件</label>
27                                 <div class="col-sm-7">
28                                     <input type="file" id="exampleInputFile" name="file">
29                                 </div>
30                                 <div class="col-sm-2"></div>
31                             </div>
32                             <div class="form-group">
33                                 <div class="col-sm-12" style="padding-top:10px">
34                                     <button type="submit" class="btn btn-primary col-sm-12">上 传</button>
35                                 </div>
36                             </div>
37                         </form>
38                     </div>
39                 </div>
40             </div>
41             <div class="col-md-3"></div>
42         </div>
43     </div>
44     <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
45     <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
46 </body>
47 </html>

controller代码

1 @RequestMapping(value="/upload", method=RequestMethod.POST)
2 public String fileUpload(@RequestPart(value="file") MultipartFile multipartFile){
3     //处理逻辑
4     String path = "E:/java/fileupload/" + file.getOriginalFilename();
5     multipartFile.transferTo(new File(path));
6 }

三.多文件上传

多文件上传只需要把html代码中的< input name=".." >name属性设置为一样的就好。然后在controller中使用MultipartFile数组接受就行。

1 @RequestMapping(value="/upload", method=RequestMethod.POST)
2 public String fileUpload(@RequestPart(value="file") MultipartFile[] multipartFiles){
3     //处理逻辑
4 }

3.References

https://my.oschina.net/cnlw/blog/168466

时间: 2024-10-07 14:35:44

《Spring实战》读书笔记--SpringMVC处理Multipart数据的相关文章

Spring实战读书笔记(1)

Spring的根本使命是? 简化Java开发 为了降低Java开发的复杂性,Spring采取了哪4种关键策略? 1.基于POJO的轻量级和最小侵入性编程 2.通过依赖注入和面向接口实现松耦合 3.基于切面和惯例进行声明式编程 4.通过切面和模板减少样板式代码 依赖注入与AOP编程 1.如果想对依赖注入有更多的认识,推荐阅读Dhanji R. Prasanna的<Dependency Injection> 2.依赖注入让相互协作的软件组件保持松散耦合,而AOP编程允许你把遍布应用各处的功能分离出

R实战读书笔记四

第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号.线.颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括如下. 一图胜千字,人们从视觉层更易获取和理解信息. 图形工作 R具有非常强大的绘图功能,看下面代码. > attach(mtcars) > plot(wt, mpg) > abline(lm(mpg~wt)) > title("Regression of MPG on Weight") > detach(m

JAVA并发编程实战 读书笔记(二)对象的共享

<java并发编程实战>读书摘要 birdhack 2015年1月2日 对象的共享 JAVA并发编程实战读书笔记 我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键之synchronized只能用于实现原子性或者确定临界区.同步还有另一个重要的方面:内存可见性. 1.可见性 为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程

spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定

本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Provider提供两个功能对象的创建,依赖关系的管理. 只是,IoC容器这个词中,我们还得关注容器二字.它还包括了一些别的功能,例如以下图 Spring提供了两种类型的容器,各自是BeanFactory与ApplicationContext. 它们的差别在于: BeanFactory:对于它所管理的bean,採

spring揭秘 读书笔记 一

本文是王福强所著<<spring揭秘>>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsListener获得所有的新闻id; 2 通过newsListener,用新闻id获得新闻实体 3 用newPersistener存储新闻实体 4 再使用newsListener发布新闻 public class FXNewsProvider { private IFXNewsListener newsListene

spring揭秘 读书笔记 二

本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Provider提供两个功能对象的创建,依赖关系的管理. 不过,IoC容器这个词中,我们还得关注容器二字.它还包含了一些别的功能,如下图 Spring提供了两种类型的容器,分别是BeanFactory与ApplicationContext. 它们的区别在于: BeanFactory:对于它所管理的bean,采取的

机器学习实战读书笔记(三)决策树

3.1 决策树的构造 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配问题. 适用数据类型:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训练算法 5.测试算法 6.使用算法 3.1.1 信息增益 创建数据集 def createDataSet(): dataSet = [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, '

R语言实战读书笔记(二)创建数据集

2.2.2 矩阵 matrix(vector,nrow,ncol,byrow,dimnames,char_vector_rownames,char_vector_colnames) 其中: byrow=TRUE/FALSE,表示按行填充还是按列填充,默认情况下是按列填充 2.2.4 数据框 1.attach,detach()和with() attach():将数据框加入搜索路径 detach():将数据框移除出搜索路径 with():赋值仅在括号内有效,如果想在括号外生效也可以,用<<- 2.

Spring Batch学习笔记&mdash;&mdash;steps之间共享数据

名词说明: 上下文: 执行: 执行上下文: 案例: 警告:一旦steps共享数据,这些数据就会把这些steps连接起来.努力使steps独立.如果你实在是不能独立他们,才使用下面的技术.你应该把数据共享作为steps不能独立的后备方案. 1 数据共享方式: a step存储共享数据到数据库,receiving step从数据库读取他们 Execution context(执行上下文): 使用Spring  Batch execution context 作为data容器.a step往上下文写数