文件上传我一直感觉是个麻烦事,一提到文件上传我脑海中浮现的是二进制、byte数组、输入输出流、读写文件
感觉头都大了,所以为了以后不再头大,正好最近在看Spring in Action 正好研究下,用各种姿势上传文件。传各种小黄片^-^。

1.Spring MVC中配置文件上传
下面是我随手上传一张图片的请求体:
1 | ------WebKitFormBoundaryiYXA5UiOJRgWnKnt |
DispatcherServlet并没有实现任何解析multipart请求数据的功能。它将该任务委托给了Spring中MultipartResolver策略接口的实现,通过这个实现类来解析multipart请求中的内容。从Spring 3.1开始,Spring内置了两个MultipartResolver的实现供我们选择:
- CommonsMultipartResolver:使用Jakarta CommonsFileUpload解析multipart请求;
- StandardServletMultipartResolver:依赖于Servlet 3.0对multipart请求的支持(始于Spring 3.1)。
一般优选StandardServletMultipartResolver,不过为什么我更喜欢StandardServletMultipartResolver呢?
使用Servlet 3.0解析multipart请求(StandardServletMultipartResolver)
在Spring应用上下文中,将其声明为bean就会非常简单,如下所示:
1 |
|
上面配置还不能正常使用,我们还需要设置存放路径,限制文件大小、类型等
我们需在web.xml或Servlet初始化类中配置。
如果我们采用Servlet初始化类的方式来配置DispatcherServlet的话,这个初始化类应该已经实现了WebApplicationInitializer,那我们可以在Servlet registration上调用setMultipartConfig()方法,传入一
个MultipartConfigElement实例,
1 |
|
如果使用传统的xml配置,则在web.xml中配置如下:
使用Jakarta Commons FileUpload multipart解析器
Spring内置了CommonsMultipartResolver,可以作为StandardServletMultipartResolver的替代方案
将CommonsMultipartResolver声明为Spring bean的最简单方式如下:
2.处理multipart 请求(接收上传文件)
- 控制器接收参数上添加@RequestPart注解

这种用数组接收的方式很原始,没用文件类型,文件名等等,还要自己写流存文件。
接收MultipartFile
将数组换成MultipartFile接收,内置方法如下:
将MultipartFile保存到七牛云,阿里云等云存储中
也就是利用MultipartFile获取文件信息保存到远程服务器,暂不写
Part接口:Spring MultipartFile的替代方案
和上面的API差不多,值得一提的是,如果在编写控制器方法的时候,通过Part参数的形式
接受文件上传,那么就没有必要配置MultipartResolver了。只有使用MultipartFile的时候,我们才需要
MultipartResolver。
3.上传案列
下面是我在项目中随手写的一个上传文件类,本来项目使用的是百度的Ueditor上传文件,但是Ueditor是上传文件到项目的目录下面,每次部署war包都会覆盖原来的上传文件,必须先备份上传的文件,部署完项目后又重新传上去,很是麻烦。由于是前后端分离,前端静态资源部署在Nginx所以自己写了个上传请求将文件传到Nginx目录下边。
1 |
|
项目并发量不大,所以代码没过多优化设计。项目使用的是SpringBoot
spring:
http:
multipart:
max-file-size: 100MB
max-request-size: 100MB
enabled: true
SpringBoot大发好,multipart都不需要配那么多那么麻烦,真是浪费生命