Frühling Datei-upload nicht verbindlich, Modell Attribut-Objekt

Will ich bauen einen einfachen Datei-upload-Funktionalität mit Spring MVC.

Habe ich die multipartResolver in Ort und arbeiten:

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

Beim hochladen einer Datei wird protokolliert:

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]

was mir sagt, dass es grundsätzlich funktioniert.

Dies ist Teil meiner 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>

Dies ist meine Modell-Attribut Objektklasse:

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

- Und das ist Teil meiner Controller-Methode:

@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();
}

Was passiert, ist, dass die imageUpload-Attribut des form-Objekt ist nicht gefüllt, (null), während alle anderen Eigenschaften sind.

Fand ich, dass es funktioniert, wenn ich diese in die Steuerung:

@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();
}

So, dass die MultipartFile als @RequestParam funktioniert, aber die Bindung an die form ist modelAttribute Objekt nicht. Ich fand Hunderte von Beispielen im web, tun das gleiche und ich finde nicht den Unterschied.

Ich Lerne immer noch Frühling, so dass ich vielleicht vermissen, ein sehr offensichtlicher Punkt. Ich konnte einfach die zweite version von dem controller, aber ich verstehe es nicht, und als ich sagte, ich bin zu lernen.

Sollten nicht alle die <form:input path="abc"> Eigenschaften innerhalb der <form:form modelAttribute="xyz">...</form:form> gebunden xyz.abc? Es funktioniert, wie dies für alle Eigenschaften außer der Datei-upload.

Irgendwelche Erkenntnisse?
Dank

InformationsquelleAutor marc82ch | 2013-07-21
Schreibe einen Kommentar