Spring Boot如何仅在图片文件非空时执行自定义上传校验
图片上传校验逻辑调整需求
我正在Spring Boot中通过自定义消息和自定义校验器实现图片上传校验功能,校验器文件的存储路径可参考下图:
我需要实现的校验逻辑是:先检查上传的图片文件是否存在、是否非空,仅当文件不为空时才执行后续的格式校验;若文件为null,则不需要触发任何校验规则直接通过。
现有实现代码
自定义校验注解@ValidImage
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = {ImageFileValidator.class}) public @interface ValidImage { String message() default "Invalid image file"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
对应校验器ImageFileValidator
import org.springframework.web.multipart.MultipartFile; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class ImageFileValidator implements ConstraintValidator<ValidImage, MultipartFile> { @Override public void initialize(ValidImage constraintAnnotation) { } @Override public boolean isValid(MultipartFile multipartFile, ConstraintValidatorContext context) { boolean result = true; String contentType = multipartFile.getContentType(); if (!isSupportedContentType(contentType)) { context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate( "Only PNG or JPG images are allowed.") .addConstraintViolation(); result = false; } return result; } private boolean isSupportedContentType(String contentType) { return contentType.equals("image/png") || contentType.equals("image/jpg") || contentType.equals("image/jpeg"); } }
请求参数类绑定注解
public class CreateUserParameters { @ValidImage private MultipartFile image; ... }
上述自定义校验器的基础代码来自Stack Overflow用户Wim Deblauwe的公开问答内容。
修改方案
只需要调整ImageFileValidator类的isValid方法,在逻辑最开头增加空值判断即可:当传入的文件为null或者空文件时,直接返回true跳过校验,只有存在实际上传文件时才执行后续格式校验。
修改后的完整校验器代码如下:
import org.springframework.web.multipart.MultipartFile; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class ImageFileValidator implements ConstraintValidator<ValidImage, MultipartFile> { @Override public void initialize(ValidImage constraintAnnotation) { } @Override public boolean isValid(MultipartFile multipartFile, ConstraintValidatorContext context) { // 空文件直接跳过校验 if (multipartFile == null || multipartFile.isEmpty()) { return true; } boolean result = true; String contentType = multipartFile.getContentType(); if (!isSupportedContentType(contentType)) { context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate( "Only PNG or JPG images are allowed.") .addConstraintViolation(); result = false; } return result; } private boolean isSupportedContentType(String contentType) { return contentType.equals("image/png") || contentType.equals("image/jpg") || contentType.equals("image/jpeg"); } }
修改后无需调整其他代码,即可满足仅非空文件执行校验的需求。
内容的提问来源于stack exchange,提问作者Ahmed Mohamed
相关产品推荐
相关产品推荐

