我创建了一个自定义验证器,用于检查上传文件类型的Spring Boot应用程序。这个
@ValidFileType
注释定义为
@Documented
@Constraint(validatedBy = MultiPartFileValidator.class)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidFileType {
String[] allowed() default {
"image/webp",
"image/svg+xml",
"application/zip",
};
String message() default "{com.example.invalidFileType}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
验证器本身是
class MultiPartFileValidator implements ConstraintValidator<ValidFileType, MultipartFile> {
private Set<String> allowed;
@Override
public void initialize(ValidFileType constraintAnnotation) {
allowed = Set.of(constraintAnnotation.allowed());
}
@Override
public boolean isValid(MultipartFile file, ConstraintValidatorContext context) {
return file == null || allowed.contains(file.getContentType());
}
}
这通常用于控制器方法,如下所示:
@PostMapping
public void uploadFile(@Valid @ValidFileType @RequestPart MultipartFile uploadedFile) {
// if we get this far, the file that has passed validation
}
然而,有人指出,这个验证器完全依赖于
content-type
标题可以被欺骗。如果我不能依赖这个标头(或文件名中的扩展名),还有什么可以用来验证更具弹性的文件类型吗?