13

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

そのため、MultipartFile は@RequestParam機能しますが、フォームのmodelAttributeオブジェクトにバインドすることはできません。ウェブ上でほぼ同じことをする何百もの例を見つけましたが、違いはわかりません。

私はまだSpringを学んでいるので、非常に明白な点を見逃す可能性があります。コントローラの 2 番目のバージョンを使用することもできましたが、理解できず、前述のとおり学習中です。

内のすべての<form:input path="abc">プロパティを<form:form modelAttribute="xyz">...</form:form>にバインドするべきではありませんxyz.abcか? ファイルのアップロードを除くすべてのプロパティでこのように機能します。

洞察はありますか?ありがとう

4

1 に答える 1