##やりたいこと
Spring Bootのバリデーション についてです。
ファイルアップロード時に1MBを超えたファイルに関しては
バリデーション でエラーメッセージを表示しようとしています。
##現状
1MB以上のファイルをアップロードするとバリデーション ではなく
以下のエラーが発生。
エラーの意味は理解しているがバリデーション が働かない理由がわからない
なにかアドバイスをいただけると幸いです。
よろしくお願いいたします。
##エラー
error
1org.springframework.web.util.NestedServletException: 2Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: 3Maximum upload size exceeded; 4nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: 5The field uploadFile exceeds its maximum permitted size of 1048576 bytes.
##バリデーション
java
1@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) 2@Retention(RetentionPolicy.RUNTIME) 3@Constraint(validatedBy = UploadFileMaxSizeValidator.class) 4public @interface UploadFileMaxSize { 5 String message() default "{spring.app.profile.validation.UploadFileNotEmpty.message}"; 6 long value() default (1024 * 1024); 7 Class<?>[] groups() default {}; 8 Class<? extends Payload>[] payload() default {}; 9 10 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) 11 @Retention(RetentionPolicy.RUNTIME) 12 @Documented 13 @interface List { 14 UploadFileMaxSize[] value(); 15 } 16 17}
java
1public class UploadFileMaxSizeValidator implements 2ConstraintValidator<UploadFileMaxSize, MultipartFile> { 3 4private UploadFileMaxSize constraint; 5 6@Override 7public void initialize(UploadFileMaxSize constraint) { 8 this.constraint = constraint; 9} 10 11@Override 12public boolean isValid(MultipartFile multipartFile, 13 ConstraintValidatorContext context) { 14 if (constraint.value() < 0 || multipartFile == null) { 15 return true; 16 } 17 return multipartFile.getSize() <= constraint.value(); 18} 19 20}
##Formクラス @FileRequiredは問題なく働く
java
1public class FileUploadForm 2{ 3 @FileRequired(message="ファイルを選択して下さい") 4 @UploadFileNotEmpty(message="ファイルが空です。") 5 @UploadFileMaxSize(message="1MB以下のファイルを選択してください") 6 private MultipartFile uploadFile; 7 8 public MultipartFile getUploadFile() 9 { 10 return uploadFile; 11 } 12 13 public void setUploadFile(MultipartFile uploadFile) 14 { 15 this.uploadFile = uploadFile; 16 } 17}
##Controllerクラス
java
1//プロフィール画像をアップロード 2 @PostMapping("upload") 3 public String upload(@Validated FileUploadForm fileUploadModel, 4 BindingResult bindingResult, 5 @AuthenticationPrincipal LoginUserDetails userDetails, 6 Model model){ 7 if(bindingResult.hasErrors()) { 8 return showProfileEdit(model); 9 } 10 User user = userDetails.getUser(); 11 int userId = user.getUserId(); 12 String path = String.valueOf(userId); 13 user.setProfileImage(path); 14 userRepository.save(user); 15 s3UploadHelper.saveImage(userId,fileUploadModel.getUploadFile()); 16 return "redirect:profile/edit"; 17 }
回答1件
あなたの回答
tips
プレビュー