Printemps de téléchargement de fichiers ne lie pas le modèle de l'attribut de l'objet
Je veux construire un simple fichier de téléchargement fonctionnalités à l'aide de Spring MVC.
J'ai le multipartResolver en place et de travail:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10240000"/>
</bean>
Lors du téléchargement d'un fichier c'est connecté:
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]
qui me dit que c'est fondamentalement de travail.
Cela fait partie de ma 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>
C'est mon modèle attribut de classe de l'objet:
public class PlaceEditForm
{
@Valid
private Place place = new Place();
private Map<Integer, PlaceFeature> features;
private MultipartFile imageUpload;
... getter/setter omitted...
}
Et cela fait partie de ma méthode de Contrôleur:
@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();
}
Ce qui se passe, c'est que les imageUpload attribut de l'objet de formulaire n'est pas rempli (null), alors que toutes les autres propriétés sont.
J'ai trouvé que cela fonctionne quand je l'utilise dans le contrôleur:
@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();
}
Ainsi, le MultipartFile comme un @RequestParam
œuvres, mais qui le lie à la forme du modelAttribute
objet qui ne fonctionne pas. J'ai trouvé des centaines d'exemples sur le web que faire au sujet de la même et je ne trouve pas la différence.
Je suis encore à apprendre le Printemps, donc je risque de manquer une très évident. Je pourrais simplement utiliser la deuxième version de la manette, mais je ne le comprends pas, et comme je l'ai dit, je suis d'apprentissage.
Ne devrait pas toutes les <form:input path="abc">
propriétés à l'intérieur de la <form:form modelAttribute="xyz">...</form:form>
être lié à xyz.abc
? Il fonctionne comme ceci pour toutes les propriétés à l'exception du téléchargement d'un fichier.
Des idées?
Grâce
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé le problème:
J'avais une méthode de ce genre dans le contrôleur, mais il a oublié d'ajouter la
imageUpload
de la propriété.Très stupide et facile une fois trouvé..!
Cela empêche le classeur de lier les autres propriétés de la modelAttribute que celles indiquées. Très importante mesure de sécurité pour empêcher les méchants de l'alimentation dans de dangereuses informations dans votre système, lorsque vous seulement de valider ce que vous attendez d'être sur le front-end.