2013-07-21 12 views
12

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

risposta

5

ho trovato il problema:

avevo un metodo come questo nel controller, ma ha dimenticato di aggiungere la proprietà imageUpload. Molto stupido e facile una volta trovato ..!

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

Questo impedisce il legante per legare qualsiasi altra proprietà alla modelAttribute di quelli specificati. Misure di sicurezza molto importanti per impedire ai malfattori di immettere informazioni pericolose nel tuo sistema, quando convalidi solo ciò che ti aspetti di essere sul front-end.

Problemi correlati