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
か? ファイルのアップロードを除くすべてのプロパティでこのように機能します。
洞察はありますか?ありがとう