Springboot表单处理
首先创建一个存放数据的表单实体类,就先命名为FormEntity
@Data
public class FormEntity {
/**
* 用户名
*/
private final String userName;
/**
* 密码
*/
private final String password
/**
* 头像文件
*/
private final MultipartFile avatar
}@Data是 Lombok 中的一种注解,注解在类上,将类提供的所有属性都添加 get、set方法,并添加 equals、canEquals、hashCode、toString 方法。更多用法可以参考Java中优雅的使用Lombok
MultipartFile 是 SpringMVC 提供简化上传操作的工具类,在不使用框架之前,都是使用原生的 HttpServletRequest 来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换为 File 类。更多信息可以参考MultipartFile工具类
对应的前端表单,这里我没有使用前后端分离,而是使用了 Thymeleaf 模板引擎
<form th:action="@{/register}" method="post" enctype="multipart/form-data">
<label for="userName">用户名</label>
<input type="text" name="userName" id="userName">
<label for="password">密码</label>
<input type="password" name="password" id="password">
<label for="avatar">头像文件</label>
<input type="file" name="avatar" id="avatar">
<button type="submit">提交</button>
<button type="reset">重置</button>
</form> 表单 HTML 中的 input 标签的 name 属性需要对应 Form 实体类的属性变量,如果需要在表单中预先显示后端返回的值,可以使用 th:value 。 一般情况下,Thymeleaf 都可以使用 th:{hmtl标签},比如 th:action,th:attr,th:value等等。具体可以参考官方文档Tutorial: Thymeleaf + Spring
表单提交后应该交给专门的服务类去处理,而不是放在控制器中处理。
@PostMapping("/register")
public String processForm(FormEntity form) {
FormProcess.check(form);
...
...
}FormEntity 就是最开始创建的表单实体类,FormProcess 是创建的处理表单的服务类,里面包含对表单的各种处理。
接下来重点讲下对于上传文件的处理。
// 获取文件名以及后缀名
String fileName = form.getAvatar.getOriginalFilename();
// 如果只是要获取文件名不带后缀
String fileNameWithOutExtensions = FilenameUtils.removeExtension(form.getAvatar.getOriginalFilename());
// 重新生成文件名,使用 UUID命名(加后缀名)
fileName = UUID.randomUUID() + "." + FilenameUtils.getExtension(form.getAvatar.getOriginalFilename());
// 指定上传文件本地存储目录,不存在则需要提前创建
String dirPath = "F:/avatar/";
File filePath = new File(dirPath);
if(!filePath.exists()) {
filePath.mkdirs();
}
try {
form.getAvatar.transferTo(new File(dirPath + fileName));
} catch (Exception e) {
e.printStackTrace();
}这里的 form.getAvatar 使用 FormEntity 实体类添加 @Data 注解后自动生成的方法。使用 UUID 重命名文件是因为有些文件如果带有中文名称容易在各种系统中产生乱码,一般的做法是在数据库建立文件名的字段和文件存放路径的字段用于标识一个文件。
如果涉及到一个 input 标签内有多个文件上传则可以参考下图的代码,这里有不具体写了

评论已关闭