2013-07-21 8 views
12

Spring MVCを使用して簡単なファイルアップロード機能を構築したいと考えています。それは基本的に取り組んでいることを私に語っSpringのファイルアップロードがモデル属性オブジェクトにバインドされていません

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] 

:これは、ログに記録されたファイルをアップロードする際に

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

は私が場所にと作業multipartResolverを持っています。

これは私のJSPの一部です:

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

そして、これは私のコントローラメソッドの一部です:

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

これは私のモデル属性オブジェクトのクラスである

@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)のに対し、他のすべてのフォームプロパティそうです。

私は、コントローラでこれを使用するとき、それは仕事をしていることが見つかりました:@RequestParam作品としてMultipartFileを有するので

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

が、フォームのmodelAttributeオブジェクトに結合することはありません。ウェブ上で同じことをする数百もの例が見つかりましたが、違いは見つかりません。

私はまだ春を学んでいるので、非常に明白な点を見逃すかもしれません。コントローラーの2番目のバージョンを使用することはできますが、私はそれを理解できません。私が言ったように、私は学習しています。

<form:form modelAttribute="xyz">...</form:form>内の<form:input path="abc">プロパティのすべてがxyz.abcにバインドされていてはなりませんか?これは、ファイルアップロード以外のすべてのプロパティでこのように機能します。

洞察? おかげ

答えて

5

私は問題を発見:

私はコントローラで、このような方法があったが、imageUploadプロパティを追加するのを忘れ。 一度見つけたばかばかしい非常に愚かな..!

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

これは、バインダーが他のプロパティを指定されたプロパティ以外のプロパティにバインドするのを防ぎます。危険な情報をシステムに送り込まないようにするための非常に重要なセキュリティ対策。フロントエンドにあると予想されるものの妥当性を確認するだけです。

関連する問題