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

问题描述 投票:2回答:3

我在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而另一个没有)?

java spring-mvc file-upload multipartform-data
3个回答
0
投票

我有同样的问题,只是添加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..
}  

-1
投票

尝试添加

(required=false)

到方法签名中的multipart属性。


-1
投票

如果希望使用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.
}
© www.soinside.com 2019 - 2024. All rights reserved.