Как отобразить ошибки проверки загруженного многокомпонентного файла с помощью Spring MVC

у меня естьSpring MVC приложение сФорма загрузки файла.

Я хотел бы иметь возможность отображать ошибки проверки пользователю, если загруженный контент недействителен (например, контент не является изображением и т. Д.)

Тем не менее, по определению, то, что публикуется, имеет тип: (MultipartFileмногочастному / форм-данных,) и поэтому я могуне иметь@ModelAttribute в моей форме и для того, чтобы использоватьBindingResultВроде мне нужна@ModelAttribute незадолго до.BindingResult

Мой вопрос заключается в том, что является наиболее подходящим способом отображения ошибок проверки пользователю, когда у меня есть толькоMultipartFile? Я мог бы, конечно, вручную добавить атрибуты модели в модель, но я уверен, что есть лучший способ.

Ответы на вопрос(2)

Решение Вопроса

Вот метод контроллера:

@RequestMapping(method = RequestMethod.POST)
    public String processUploadWithModelAttribute(@ModelAttribute("myModelAttribute") final MyModelAttribute myModelAttribute, final BindingResult result, final Model model) throws IOException {
        String mimeType = determineMimeType(myModelAttribute.getFile().getBytes());
        if (mimeType.equalsIgnoreCase("application/pdf")){
            result.addError(new ObjectError("file", "pdf not accepted"));
        }
            return "fileupload";
    }

И класс атрибута модели:

public class MyModelAttribute {

    private MultipartFile file;

    public MultipartFile getFile() {
        return file;
    }

    public void setFile(MultipartFile file) {
        this.file = file;
    }
}

Идея состоит в том, чтобы поместить MultipartFile в ModelAttribute в качестве атрибута.

 balteo05 мар. 2014 г., 17:50
Это пользовательский метод.
 FAvIo4105 мар. 2014 г., 17:46
Отсутствует какая-то часть вашего кода, метод defineMimeType взят из импорта или это пользовательский метод?

вы можете сделать аннотацию, которая проверяет тип контента. Смотрите код ниже.

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
/**
 * The annotated element must have specified content type.
 *
 * Supported types are:
 * <ul>
 * <li><code>MultipartFile</code></li>
 * </ul>
 *
 * @author Michal Kreuzman
 */
@Documented
@Retention(RUNTIME)
@Constraint(validatedBy = {ContentTypeMultipartFileValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
public @interface ContentType {

    String message() default "{com.kreuzman.ContentType.message}";

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

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

/**
 * Specify accepted content types.
 *
 * Content type example :
 * <ul>
 * <li>application/pdf - accepts PDF documents only</li>
 * <li>application/msword - accepts MS Word documents only</li>
 * <li>images/png - accepts PNG images only</li>
 * </ul>
 *
 * @return accepted content types
 */
     String[] value();
}
/**
  * Validator of content type. This is simple and not complete implementation
  * of content type validating. It's based just on <code>String</code> equalsIgnoreCase
  * method.
  *
  * @author Michal Kreuzman
  */
 public class ContentTypeMultipartFileValidator implements ConstraintValidator<contenttype, multipartfile=""> {

private String[] acceptedContentTypes;

@Override
public void initialize(ContentType constraintAnnotation) {
    this.acceptedContentTypes = constraintAnnotation.value();
}

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

    return ContentTypeMultipartFileValidator.acceptContentType(value.getContentType(), acceptedContentTypes);
}

private static boolean acceptContentType(String contentType, String[] acceptedContentTypes) {
    for (String accept : acceptedContentTypes) {
            // TODO this should be done more clever to accept all possible content types
        if (contentType.equalsIgnoreCase(accept)) {
            return true;
        }
    }

    return false;
}
}
</contenttype,>
public class MyModelAttribute {

@ContentType("application/pdf")
private MultipartFile file;

public MultipartFile getFile() {
    return file;
}

public void setFile(MultipartFile file) {
    this.file = file;
}
}
@RequestMapping(method = RequestMethod.POST)
public String processUploadWithModelAttribute(@ModelAttribute("myModelAttribute") @Validated final MyModelAttribute myModelAttribute, final BindingResult result, final Model model) throws IOException {
 if (result.hasErrors()) {
     // Error handling
     return "fileupload";
 }

 return "fileupload";
}

Ваш ответ на вопрос