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フォームプラグインであることが判明しました-何も送信されません。

次のように入力されていない場合は、送信前に fileData 値を削除して問題を解決しました。

 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 issue 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.MultipartFileCommonsMultipartFile の代わりに使用

于 2013-02-08T11:43:18.533 に答える
0

あなたはあなたの中でmultipartResolver豆を定義しています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 に答える