6

我们正在创建一个配置文件页面,其中包含一个可选的配置文件图片。我们正在使用 Spring 3.2

这是表格: -

<form:form id="editMember" modelAttribute="memberAjaxEditModel"
    method="POST" class="form-horizontal" enctype="multipart/form-data" >
    ...
    <form:input path="fileData" type="file"/>
    ...
</form>

这是控制器方法: -

@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public String onEditPost(@PathVariable long id, @Valid @ModelAttribute(MemberAjaxEditModel.KEY) MemberAjaxEditModel model, BindingResult result) throws ServiceRecoverableException {
....
}

这是模型

public class MemberAjaxEditModel {

...
private CommonsMultipartFile fileData;
...
}

如果在表单上提交了文件,它可以正常工作,但是如果在没有文件的情况下提交表单,则 BindingResult 变量中会出现错误。

这是错误: -

Field error in object 'memberAjaxEditModel' on field 'fileData': rejected value []; codes [typeMismatch.memberAjaxEditModel.fileData,typeMismatch.fileData,typeMismatch.org.springframework.web.multipart.commons.CommonsMultipartFile,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [memberAjaxEditModel.fileData,fileData]; arguments []; default message [fileData]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.web.multipart.commons.CommonsMultipartFile' for property 'fileData'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile] for property 'fileData': no matching editors or conversion strategy found]
4

5 回答 5

6

原来是jQuery Form 插件发送了一个空字符串,而不是 spring 所期望的 - 没有发送任何内容。

如果没有像这样填充 fileData 值,我使用 before submit 解决了这个问题:-

 function beforeSubmit(arr, $form, options){
     var fileDataIndex = -1;

     $.each(arr, function(index, value) {
          if (value.name == "fileData"){
              if (value.value.length == 0){
                  fileDataIndex = index;
              }
          }
        });

     if (fileDataIndex != -1){
        arr.remove(fileDataIndex);
     }
 }

我希望这可以帮助一些遇到同样问题的谷歌用户。

于 2013-02-11T14:28:10.617 回答
2

另见github问题296

您可以使用 iframe 选项在两种情况下强制使用相同类型的帖子:

iframe:真

于 2013-08-01T11:20:33.167 回答
2

尝试使用StringMultipartFileEditor.

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, new StringMultipartFileEditor());
}
于 2013-11-19T10:48:38.010 回答
1

使用org.springframework.web.multipart.MultipartFile而不是 CommonsMultipartFile

于 2013-02-08T11:43:18.533 回答
0

你有在你的multipartResolverbean 中定义application-context.xml吗?如果没有,那么包括这个并尝试

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
       <property name="maxUploadSize" value="1000000"/> <!-- File size in bytes. -->
</bean> 
于 2013-02-08T17:42:07.477 回答