繁体   English   中英

MultipartFile作为可选字段的多部分请求 - Spring MVC

[英]Multipart Request with MultipartFile as Optional Field - Spring MVC

我在J2EE Web应用程序上使用Spring MVC。
我创建了一个方法,将请求体绑定到如上所述的模型

@RequestMapping(value = "/", method = RequestMethod.POST, produces = "application/json")
public AModel createEntity(@Valid @ModelAttribute MyInsertForm myInsertForm) {
    // coding..
}  

一切都很好,当我在MyEntityForm中包含MultipartFile类型的属性时,我必须使用内容类型“multipart / form-data”发出请求。
此外,一切都很适合这种情况。

我面临的问题是我想将MultipartFile属性作为可选项。
当客户端请求包含文件时,我的方法很有效,但是当客户端请求不包含文件时,spring会抛出一个

HTTP状态500 - 请求处理失败; 嵌套异常是org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求; 嵌套异常是org.apache.commons.fileupload.FileUploadException:Stream意外结束

有没有办法解决这个问题而不在我的控制器上创建两个方法(一个有MultipartFile而另一个没有)?

我有同样的问题,只是添加了required=false为我工作。 请在下面找到示例代码,

@RequestMapping(value = "/", method = RequestMethod.POST, produces = "application/json")
public AModel createEntity(@Valid @ModelAttribute MyInsertForm myInsertForm, @RequestParam(value ="file", required=false) MultipartFile file) {
    // coding..
}  

尝试添加

(required=false)

到方法签名中的multipart属性。

如果希望使用HTTP发送一个或多个文件,则必须使用多部分请求。 这意味着请求的主体将如上所述,

----------------------------- 9051914041544843365972754266 Content-Disposition:form-data; NAME = “文本”

text default ----------------------------- 9051914041544843365972754266 Content-Disposition:form-data; NAME = “file1的”; filename =“a.txt”Content-Type:text / plain

a.txt的内容。

----------------------------- 9051914041544843365972754266 Content-Disposition:form-data; NAME = “file2的”; filename =“a.html”Content-Type:text / html

当您只想发送数据(而不是文件)时,可以将它们作为json,键值对等发送。

当您希望将多部分请求映射到对象时,Spring框架使用@ModelAttribute批注。 如果您有正常的键值请求,则使用@RequestBody注释。 因此,您不能选择MultipartFile,因为您必须使用不同的注释。 使用两种不同的方法,每种请求类型一种,解决了这个问题。 例,

@RequestMapping(value = "/withFile", method = RequestMethod.POST, produces = "application/json")
public ReturnModel updateFile(@ModelAttribute RequestModel rm) {
    // do something.
}

@RequestMapping(value = "/noFile", method = RequestMethod.PUT, produces = "application/json")
public ReturnModel updateJson(@RequestBody RequestModel rm) {
    // do something else.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM