Desidero creare una funzionalità di caricamento file semplice utilizzando Spring MVC.Caricamento file di primavera non vincolante per l'oggetto attributo modello
Ho la multipartResolver in atto e di lavoro:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10240000"/>
</bean>
Durante il caricamento di un file questo viene registrato:
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]
che mi dice che è fondamentalmente di lavoro.
Questo fa parte del mio 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>
Questo è il mio modello di attributo della classe dell'oggetto:
public class PlaceEditForm
{
@Valid
private Place place = new Place();
private Map<Integer, PlaceFeature> features;
private MultipartFile imageUpload;
... getter/setter omitted...
}
E questo fa parte del mio metodo di controllo:
@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();
}
Cosa accade è, che l'attributo imageUpload dell'oggetto form non è popolato (null), mentre tutti gli altri forma properti sono.
ho scoperto che funziona quando uso questo nel controller:
@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();
}
Quindi, avendo la MultipartFile come @RequestParam
opere, ma legandolo alla modelAttribute
oggetto del form non. Ho trovato centinaia di esempi sul web che fanno lo stesso e non trovo la differenza.
Sto ancora imparando la primavera, quindi potrei perdere un punto molto ovvio. Potrei semplicemente usare la seconda versione del controller, ma non la capisco e, come ho detto, sto imparando.
Non tutte le proprietà <form:input path="abc">
all'interno dello <form:form modelAttribute="xyz">...</form:form>
devono essere associate a xyz.abc
? Funziona così per tutte le proprietà tranne il caricamento del file.
Eventuali approfondimenti? Grazie