提问者:小点点

仅在spring boot中验证映像是否存在或不为null?


我正在尝试使用自定义消息和自定义验证器在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进行上载、验证和异常处理。


共1个答案

匿名用户

这不是我问题的答案,但如果有人有同样的问题,这是一个临时解决方案。

所以问题是,如果图像为空,我会告诉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,因此请确保处理它。