一、Maven依赖
- commons-fileupload
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
二、需要配置的Bean对象
- multipartResolver
<!-- id的值必须是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 允许上传的文件大小:2MB 【1024*1024*2】-->
<property name="maxUploadSize" value="2097152" />
</bean>
三、前端文件上传时的参数要求
- contentType(encType):multipart/form-data
- http method:POST
请求消息体的编码类型必须是 multipart/form-data
。 form表单默认的encType是application/x-www-form-urlencoded
,所以使用form表单上传文件的时候,必须修改encType的值。如果没有使用form表单上传,那么在发送请求时,需要将contentType的值修改为 multipart/form-data
请求头类型必须是 POST
类型。form表单请求类型默认是GET类型,文件上传时需要修改成POST
。如果没有使用form表单,那么请求发送的时候,将type/method修改成POST
。
看一下,示例代码:
<form th:action="@{/user/upload}" method="post" enctype="multipart/form-data">
用户名: <input type="text" name="name" /> <br>
年龄: <input type="text" name="age" /> <br>
头像: <input type="file" name="file" /> <br>
<input type="submit" value="添加用户">
</form>
四、后端Controller使用MultipartFile对象接收
SpringMVC底层,自动为我们完成传输文件的解析工作,并存放在MultipartFile对象中。如果是多个文件,那么Springmvc会自动将文件存放在MultipartFile[ ]数组对象中。通过调用对象,来获取其中的具体文件,直接来看代码。
@RequestMapping("/upload")
public String addUser(MultipartFile file, User user) throws IOException {
// 上传文件 - 图片服务器(分布式文件系统:FastDFS、GlusterFS【可在本地挂载路径】、MongoDB文件系统)
// 存储到本地目录: d:/upload/
// 在数据库中如何保存: 如果图片非常小,可转成 bytes64编码/二进制编码 存放到数据库中
// 如果图片大,则存放路径。 /pics/文件名.后缀
// 前端访问的时候:http://localhost:8080/springmvc-review-02/pics/文件名.后缀
// 获取文件的原始名称
String originalFilename = file.getOriginalFilename();
// 获取后缀 没有 .
String suffix = FilenameUtils.getExtension(originalFilename);
// 重命名
String prefix = UUID.randomUUID().toString().replaceAll("-", "");
// 新文件名称
String newFilename = prefix + "." + suffix;
File destFile = new File("D:/upload/" + newFilename);
file.transferTo(destFile);
user.setPic("/pics/" + newFilename);
userService.savaUser(user);
return "redirect:/user/toAdd";
}