我正在尝试使用自定义消息和自定义验证器在Spring boot中验证映像。这是我的验证器文件路径
我只需要知道如何首先检查图像文件是否存在,然后验证它。
我需要提到我的图像可以是空值,在这种情况下,我不应该做验证。
下面是更多说明的示例:
我首先创建了注释,如下所示:
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 {};
}
我创建了如下验证器:
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;
...
}
自定义验证器的代码在这里:Spring Boot中的文件上载:在最后一条评论中,由Wim Deblauwe进行上载、验证和异常处理。
这不是我问题的答案,但如果有人有同样的问题,这是一个临时解决方案。
所以问题是,如果图像为空,我会告诉ImageFileValidator将True发送到ValidImage,然后图像将被验证。这意味着我不必发送错误。
@Override
public boolean isValid(MultipartFile multipartFile, ConstraintValidatorContext context) {
boolean result = true;
String contentType = "";
try {
contentType = multipartFile.getContentType();
if(fileNameLength(multipartFile) == 0) {
return result;
}
} catch(NullPointerException e) {
e.printStackTrace();
}
if (!isSupportedContentType(contentType)) {
.....
其余代码可以在上面找到。它也可能返回NullException,因此请确保处理它。