Spring文件上载未绑定到模型属性对象[英] Spring file upload not binding to model attribute object

问题描述

我想使用Spring MVC构建一个简单的文件上传功能.

我有多余的滤波器并有效:

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

上传文件时已记录:

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]

告诉我它基本上是在工作.

这是我的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>

这是我的模型属性对象的类:

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

这是我的控制器方法的一部分:

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

发生的事情是,表单对象的imageupload属性没有填充(null),而所有其他形式属性均为.

我发现当我在控制器中使用它时它确实有效:

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

因此,将多Attrartfile作为@RequestParam有效,但是将其绑定到表单的modelAttribute对象.我在网上发现了数百个示例,这些示例大约相同,但我没有找到区别.

我仍在学习春天,所以我可能会错过一个非常明显的观点.我只能使用控制器的第二版,但我不明白,正如我所说的,我正在学习.

<form:form modelAttribute="xyz">...</form:form>内部的<form:input path="abc">属性是否应该绑定到xyz.abc?它适用于除文件上传以外的所有属性.

有什么见解吗? 谢谢

推荐答案

我发现了问题:

我在控制器中有这样的方法,但忘记添加imageUpload属性. 曾经发现非常愚蠢和简单..!

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

这可防止粘合剂将任何其他属性绑定到模型归因于指定的属性.当您仅验证您的前端期望时,以防止evildoer向危险信息馈入系统的非常重要的安全措施.

本文地址:https://www.itbaoku.cn/post/978753.html