Spring文件上传。要求文件存在

时间:2015-04-07 23:46:21

标签: java spring spring-mvc file-upload

我有简单的控制器方法,它接收文件:

  @ResponseBody
  public MyDto createProduct(MyDto dto, @RequestParam(value = "file") MultipartFile file) {

  }

问题是如果用户没有在表单中选择文件,Spring不会抛出异常。但我需要确保用户选择了一些文件。我尝试添加required = true,但它没有帮助(此外默认设置为true

实际上,只有当我的表单根本不包含名为file的参数时,Spring才会抛出异常:

  

必需的MultipartFile参数' file'不存在

但是如果没有在HTML表单中选择参数present和file,那么没有例外。

如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

您可以将MultipartFile file作为DTO的媒体资源,并编写自定义验证注释,例如@FilePresent。你的签名可能就像

  public MyDto createProduct(@Validated MyDto dto, BindingResult result) 

您将在 MyDto

中注释文件属性
@FilePresent
private MultipartFile file;

您的自定义验证码类似于:

@FilePresent 注释


@Documented
@Retention(RUNTIME)
@Constraint(validatedBy = {FilePresentMultipartFileValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
public @interface FilePresent {

    String message() default "{your.package.FilePresent.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    String value() default "true";
}

自定义验证器


public class FilePresentMultipartFileValidator implements ConstraintValidator<FilePresent, MultipartFile> {

    @Override
    public void initialize(FilePresent constraintAnnotation) {
        //NOOP
    }

    @Override
    public boolean isValid(MultipartFile value, ConstraintValidatorContext context) {
        return !(value == null || value.isEmpty());
    }

}

最后一步是在类路径(和/或其本地化的等价物)上有一个ValidationMessages.properties文件,其中包含您选择的消息值的密钥your.package.FilePresent.message