java – Spring文件上传没有绑定到model属性对象

前端之家收集整理的这篇文章主要介绍了java – Spring文件上传没有绑定到model属性对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用 Spring MVC构建一个简单的文件上传功能.

我有multipartResolver到位和工作:

<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...
}

这是我的Controller方法的一部分:

@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",BindingResult result,@RequestParam("imageUpload") MultipartFile upload,BindingResult uploadResult)
{
    logger.debug("saveNewPlace");
    logger.debug("Upload: "+upload); // Works!!
    ...
    return "redirect:/platz/"+place.getPlaceId();
}

因此,将MultipartFile作为@RequestParam有效,但将其绑定到表单的modelAttribute对象则不起作用.我在网上发现了数百个例子,大致相同,我没有找到差异.

我还在学习春天,所以我可能会想念一个非常明显的一点.我可以使用控制器的第二个版本,但是我不明白,正如我所说,我正在学习.

不应该全部< form:input path =“abc”> < form:form中的属性modelAttribute =“xyz”> …< / form:form>绑定到xyz.abc?对于除文件上传之外的所有属性,它的工作方式如此.

任何见解?
谢谢

解决方法

我发现问题:

我在控制器中有一个这样的方法,但忘记添加imageUpload属性.
非常愚蠢和容易一旦发现..!

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

这样可以防止binder绑定到modelAttribute的任何其他属性.非常重要的安全措施,以防止恶意人员将危险信息投入您的系统,当您只验证您期望在前端时.

猜你在找的Java相关文章