一、SpringMVC 的文件上传
1、Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的。
2、Spring 用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver
3、SpringMVC 上下文中默认没有装配 MultipartResolver,因此默认情况下不能处理文件的上传工作,如果想要使用 Spring 的文件上传功能,需要在上下文中配置 MultipartResolver。
MultipartFile 接口:

继承结构:

4、配置 MultipartResolver
其中有两个常用属性:
defaultEncoding:必须和用户 JSP 的 pageEncoding 属性一致,以便于正确解析表单的内容;
maxUploadSize:设置上传文件的最大文件的大小(单位是字节);
注意:为了让 CommonsMultipartResolver 正确工作,必须先将 Jakarta Commons FileUpload 及 Jakarta Commons io 的类包添加到类路径下。

二、文件上传示例
1、导入 jar 包
commons-fileupload-1.2.1.jar
commons-io-2.0.jar
Maven 方式:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2、配置文件解析器
在SpringMVC中配置一个文件上传解析器:
<!-- 配置文件上传解析器,id必须是 multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置上传文件的最大值-->
<property name="maxUploadSize" value="#{1024*1024*1024}"/>
<!--设置默认编码-->
<property name="defaultEncoding" value="utf-8"/>
</bean>
配置文件上传解析器,id必须是"multipartResolver",否则会报错误:
1 | java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured |
3、页面表单
<form action="${ctp}/upload" method="post" enctype="multipart/form-data">
用户头像:<input type="file" name="headerImg" /><br>
用户名称:<input type="text" name="userName" /><br>
<input type="submit" value="提交">
</form>
4、控制器方法
@RequestMapping(value = "/upload")
public String upload(@RequestParam(value = "userName", required = false) String userName,
@RequestParam(value = "headerImg") MultipartFile uploadFile,
Model model) {
System.out.println("上传的文件的信息:" + uploadFile);
System.out.println(uploadFile.getName());
System.out.println(uploadFile.getOriginalFilename());
//文件保存
File localFile = new File("H:\\111学习\\" + uploadFile.getOriginalFilename());
try {
uploadFile.transferTo(localFile);
model.addAttribute("msg", "文件上传成功!");
} catch (IOException e) {
model.addAttribute("msg", "文件上传失败!" + e.getMessage());
}
return "forward:/index.jsp";
}
5、小结
(1)文件上传表单准备, enctype="multipart/form-data"
(2)导入 commons-fileupload
(3)只要在 SpringMVC 配置文件中,配置一个文件上传解析器 MultipartResolver
(4)文件上传请求处理
只需要在处理器入参写一个@RequestParam(value = "headerImg") MultipartFile uploadFile 封装当前文件的信息,可以直接保存
三、多文件上传
当有多个 File 需要上传时,可以使用数组来接收:
页面表单:
<form action="${ctp}/uploadFiles" method="post" enctype="multipart/form-data">
用户头像:<input type="file" name="headerImg" /><br>
用户头像:<input type="file" name="headerImg" /><br>
用户头像:<input type="file" name="headerImg" /><br>
用户头像:<input type="file" name="headerImg" /><br>
用户名称:<input type="text" name="userName" /><br>
<input type="submit" value="提交">
</form>
控制器方法:
/**
* 多文件上传
* @param userName
* @param uploadFile
* @param model
* @return
*/
@RequestMapping(value = "/uploadFiles")
public String uploadFiles(@RequestParam(value = "userName", required = false) String userName,
@RequestParam(value = "headerImg") MultipartFile[] uploadFile,
Model model) {
System.out.println("上传的文件的信息:" + uploadFile);
for (MultipartFile multipartFile : uploadFile) {
if (!multipartFile.isEmpty()) {
//获取上传文件的名称
String fileName = multipartFile.getOriginalFilename();
//使用 UUID 或时间戳来给文件命名,防止重名
String finalFileName = UUID.randomUUID() +fileName.substring(fileName.lastIndexOf("."));
//设置文件保存的位置
String path = "H:\\111学习" + File.separator + finalFileName;
File newFile = new File(path);
try {
//将文件从原处复制到目标处
multipartFile.transferTo(newFile);
model.addAttribute("msg", "文件上传成功!");
} catch (IOException e) {
model.addAttribute("msg", "文件上传失败!" + e.getMessage());
}
}
}
return "forward:/index.jsp";
}
如果表单里面的 file 的name 值不一样,可以在入参再写一个 MultipartFile 进行接收即可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?