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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe das problem gefunden:
Hatte ich eine Methode, wie diese in der Steuerung, aber vergaß hinzuzufügen, die
imageUpload
Eigenschaft.Sehr dumm und einfach einmal finden..!
Dies verhindert, dass das Bindemittel zu binden, alle anderen Eigenschaften, die modelAttribute als die oben angegebenen. Sehr wichtige Sicherheitsmaßnahme, um zu verhindern, dass die übeltäter von der Fütterung in gefährliche Informationen in Ihr system, wenn Sie nur bestätigen, was Sie erwarten, werden auf dem front-end.