SpringBoot 上传文件判空以及格式检验流程
作者:?吾?非?水 时间:2023-01-19 05:07:36
基于jsr303 通过自定义注解实现,实现思路:
存在一些瑕疵,后续补充完善。
加入依赖
部分版本已不默认自动引入该依赖,选择手动引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
创建自定义注解以及实现类
目录结构:
FileNotEmpty
自定义注解FileNotEmptyValidator
单文件校验FilesNotEmptyValidator
多文件校验
/**
* jsr303 文件格式校验注解
*
* @author maofs
* @version 1.0
* @date 2021 -11-29 10:16:03
*/
@Documented
@Constraint(
validatedBy = {FileNotEmptyValidator.class, FilesNotEmptyValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FileNotEmpty {
/**
* Message string.
*
* @return the string
*/
String message() default "文件格式不正确";
/**
* 校验组
*
* @return the class [ ]
*/
Class<?>[] groups() default {};
/**
* Payload class [ ].
*
* @return the class [ ]
*/
Class<? extends Payload>[] payload() default {};
/**
* 需要校验的格式数组
*
* @return the string [ ]
*/
String[] format() default {};
/**
* 是否必填 为false时文件为空则不校验格式,不为空则校验格式
* 为true时文件不能为空且需要验证格式
*
* @return the boolean
*/
boolean required() default true;
/**
* 单文件校验
*
* @author maofs
* @version 1.0
* @date 2021 -11-29 10:16:03
*/
public class FileNotEmptyValidator implements ConstraintValidator<FileNotEmpty, MultipartFile> {
private Set<String> formatSet = new HashSet<>();
private boolean required;
@Override
public void initialize(FileNotEmpty constraintAnnotation) {
String[] format = constraintAnnotation.format();
this.formatSet = new HashSet<>(Arrays.asList(format));
this.required = constraintAnnotation.required();
}
@Override
public boolean isValid(MultipartFile multipartFile, ConstraintValidatorContext constraintValidatorContext) {
if (multipartFile == null || multipartFile.isEmpty()) {
return !required;
}
String originalFilename = multipartFile.getOriginalFilename();
assert originalFilename != null;
String type = originalFilename.substring(originalFilename.lastIndexOf('.') + 1).toLowerCase();
if (!formatSet.isEmpty()) {
return formatSet.contains(type);
}
return true;
}
}
/**
* 多文件校验
*
* @author maofs
* @version 1.0
* @date 2021 -11-29 10:16:03
*/
public class FilesNotEmptyValidator implements ConstraintValidator<FileNotEmpty, MultipartFile[]> {
private Set<String> formatSet = new HashSet<>();
private boolean required;
@Override
public void initialize(FileNotEmpty constraintAnnotation) {
String[] format = constraintAnnotation.format();
this.formatSet = new HashSet<>(Arrays.asList(format));
this.required = constraintAnnotation.required();
}
@Override
public boolean isValid(MultipartFile[] multipartFiles, ConstraintValidatorContext constraintValidatorContext) {
if (multipartFiles == null || multipartFiles.length == 0) {
return !required;
}
for (MultipartFile file : multipartFiles) {
String originalFilename = file.getOriginalFilename();
assert originalFilename != null;
String type = originalFilename.substring(originalFilename.lastIndexOf('.') + 1).toLowerCase();
if (formatSet.isEmpty() || !formatSet.contains(type)) {
return false;
}
}
return true;
}
}
全局异常处理
/**
* 统一异常处理
*
* @author maofs
* @version 1.0
* @date 2021 -11-29 10:16:03
*/
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result<String> handle(Exception e) {
logger.error(e.getMessage());
StringBuilder stringBuilder = new StringBuilder();
//jsr303异常
if (e instanceof ConstraintViolationException) {
ConstraintViolationException ex = (ConstraintViolationException)e;
Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();
for (ConstraintViolation<?> constraintViolation : constraintViolations) {
stringBuilder.append(constraintViolation.getMessageTemplate());
}
} else if (e instanceof BindException) {
BindException bindException = (BindException)e;
stringBuilder.append(bindException.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(",")));
} else {
stringBuilder.append("未知错误:").append("请联系后台运维人员检查处理!");
}
return ResultUtil.fail(stringBuilder.toString());
}
}
使用示例
/**
* 文件上传示例接口
*
* @author maofs
* @version 1.0
* @date 2021 -11-19 16:08:26
*/
@RestController
@Validated
@RequestMapping("/annex")
public class AnnexController {
@Resource
private IAnnexService annexService;
/**
* 文件上传示例1
*
* @param uploadDTO the upload dto
* @return the result
*/
@PostMapping(value = "/upload1")
public Result<String> upload(@Valid AnnexUploadDTO uploadDTO) {
return Boolean.TRUE.equals(annexService.upload(uploadDTO)) ? ResultUtil.success() : ResultUtil.fail();
}
/**
* 文件上传示例2
*
* @param number 项目编号
* @param pictureFile 图片文件
* @param annexFile 附件文件
* @return result result
*/
@PostMapping(value = "/upload2")
public Result<String> upload(@NotBlank(@FileNotEmpty(format = {"png", "jpg"}, message = "图片为png/jpg格式", required = false)
MultipartFile pictureFile, @FileNotEmpty(format = {"doc", "docx", "xls", "xlsx"}, message = "附件为doc/docx/xls/xlsx格式", required = false)
MultipartFile annexFile) {
return Boolean.TRUE.equals(annexService.upload( pictureFile, annexFile)) ? ResultUtil.success() : ResultUtil.fail();
}
@Data
static class AnnexUploadDTO{
@FileNotEmpty(format = {"pdf","doc","zip"}, message = "文件为pdf/doc/zip格式")
private MultipartFile[] file;
}
}
结果展示
来源:https://blog.csdn.net/weixin_43931248/article/details/122000087
标签:上传文件,判空,格式检验
0
投稿
猜你喜欢
spring cloud alibaba Nacos 注册中心搭建过程详解
2022-07-08 17:38:01
Jenkins Pipeline 部署 SpringBoot 应用的教程详解
2022-09-26 14:06:27
Android数据持久化之Preferences机制详解
2021-09-04 23:42:32
如何使用C#操作幻灯片
2023-08-27 01:06:01
Java浅析枚举类的使用
2023-11-10 14:12:58
Java 实战项目之毕业设计管理系统的实现流程
2021-12-26 00:10:10
Java中的字节,字符输出流与字节和字符输入流的简单理解
2022-11-30 01:56:13
Java聊天室之实现获取Socket功能
2023-09-19 03:57:10
Android升级支持库版本遇到的两个问题详解
2023-12-02 11:24:38
JAVA 获取系统当前时间实例代码
2022-09-01 05:53:01
Java web的读取Excel简单实例代码
2023-05-29 08:25:37
C#中ref关键字的用法
2022-07-17 21:30:47
Android 蓝牙BLE开发完全指南
2023-07-03 03:15:06
Android开发笔记之:Handler Runnable与Thread的区别详解
2023-11-10 12:29:01
Android中解决页签手指按下从左到右滑动的bug
2021-06-04 19:22:40
深入理解Javascript中的this关键字
2022-03-08 16:52:25
导入maven项目各个注解均报错的解决方案
2022-02-23 12:35:09
Android编程实现对电池状态的监视功能示例
2023-11-16 08:40:03
Android实现图片左右滑动效果
2022-11-30 09:30:35
Java 爬虫工具Jsoup详解
2022-04-11 03:46:16