복붙노트

[SPRING] Spring 파일 업로드가 모델 속성 객체에 바인딩되지 않음

SPRING

Spring 파일 업로드가 모델 속성 객체에 바인딩되지 않음

Spring MVC를 사용하여 간단한 파일 업로드 기능을 만들고 싶습니다.

multipartResolver를 제자리에두고 작업하고 있습니다.

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="10240000"/>
</bean>

파일을 업로드 할 때 기록됩니다 :

DEBUG:[org.springframework.web.multipart.commons.CommonsMultipartResolver]: Found multipart file [imageUpload] of size 29081 bytes with original filename [xyz.jpg], stored at [/home/myuser/workspace/myProject/target/tmp/upload_67f1107c_1b8f_402c_bebd_6cd8a6e4c830_00000032.tmp]

그것은 기본적으로 작동한다는 것을 말해줍니다.

이것은 내 JSP의 일부입니다.

<form:form modelAttribute="placeForm" action="/platz/save" method="post" cssClass="placeForm" enctype="multipart/form-data">
...
        <label for="imageUpload">Upload</label>
        <form:input type="file" path="imageUpload" id="imageUpload" accept="image/*" />
...
</form:form>

이것은 내 모델 속성 객체의 클래스입니다.

public class PlaceEditForm
{
    @Valid
    private Place place = new Place();
    private Map<Integer, PlaceFeature> features;
    private MultipartFile imageUpload;
... getter/setter omitted...
}

그리고 이것은 내 Controller 메소드의 일부입니다.

@RequestMapping(value="/save", method=RequestMethod.POST)
public String savePlace (@Valid @ModelAttribute("placeForm") PlaceEditForm form, BindingResult result)
{
    logger.debug("saveNewPlace");
    logger.debug("Upload: "+form.getImageUpload()); // null
    ...
    return "redirect:/platz/"+place.getPlaceId();
}

폼 개체의 imageUpload 특성은 채워지지 않고 (null), 다른 모든 양식 속성은 채워지지 않습니다.

컨트롤러에서 이것을 사용할 때 작동한다는 것을 알았습니다.

@RequestMapping(value="/save", method=RequestMethod.POST)
public String savePlace (@Valid @ModelAttribute("placeForm") PlaceEditForm form, BindingResult result, @RequestParam("imageUpload") MultipartFile upload, BindingResult uploadResult)
{
    logger.debug("saveNewPlace");
    logger.debug("Upload: "+upload); // Works!!
    ...
    return "redirect:/platz/"+place.getPlaceId();
}

따라서 MultipartFile을 @RequestParam으로 사용하는 것은 가능하지만 폼의 modelAttribute 객체에 바인딩하는 것은 아닙니다. 웹에서 수백 가지 예제를 발견했는데 그 차이는 거의 같지 않습니다.

나는 아직도 봄을 배우고있어, 아주 명백한 점을 놓칠지도 모른다. 컨트롤러의 두 번째 버전 만 사용할 수는 있지만 이해가되지 않습니다. 제가 말했던 것처럼 저는 배우고 있습니다.

... 내의 모든 속성이 xyz.abc에 바인딩되어 있어야합니까? 파일 업로드를 제외한 모든 속성에서 이와 같이 작동합니다.

어떤 통찰력? 감사

해결법

  1. ==============================

    1.문제를 발견 :

    문제를 발견 :

    컨트롤러에서 이와 같은 메소드가 있지만 imageUpload 속성을 추가하는 것을 잊어 버렸습니다. 한번 멍청하고 쉽게 ..

    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        binder.setAllowedFields("place.placeId", "place.name", "place.description", "place.directions", "place.coordinates*", "features*", "tmpFiles*", "removeFiles*");
    }
    

    이렇게하면 바인더가 지정된 속성보다 다른 속성을 modelAttribute에 바인딩 할 수 없습니다. 위험한 정보를 시스템에 공급하는 것을 막기위한 매우 중요한 보안 수단. 프런트 엔드에있을 것으로 예상되는 것의 유효성 만 확인하면됩니다.

  2. from https://stackoverflow.com/questions/17773777/spring-file-upload-not-binding-to-model-attribute-object by cc-by-sa and MIT license