Spring Controller @RequestBody可以上传文件吗?

我有一个像这样的控制器,我想提交一个带有文件上传的表单,以及一些表单数据(如标签),如下所示。另外,我想使用@RequestBody做到这一点,所以我可以在包装器上使用@Valid注释,因为将添加更多变量。

public @ResponseBody WebResponse<Boolean> updateEUSettings(

final Locale locale,

@Validated @ModelAttribute final EUPSettingsWrapper endUserPortalSettingsWrapper) {

}

我的包装是:

public class EUPSettingsWrapper {

private String label;

private MultipartFile logo;

// getter , setters..etc...

}

但我想将其从ModelAttributes转换为@RequestBody。

我正在尝试的方法是通过将文件上传作为请求参数分开,如下所示:

public @ResponseBody WebResponse<Boolean> updateEUSettings(

final Locale locale,

@Validated @RequestBody final EUPSettingsWrapper endUserPortalSettingsWrapper,

@RequestParam(value = "file1", required = true) final MultipartFile logo) {

endUserPortalSettingsWrapper.setLogo(logo);

// ...

}

在我的模拟MVC中,我正在设置:

getMockMvc().perform(fileUpload(uri).file(logo)

.accept(MediaType.APPLICATION_JSON)

.content(JSONUtils.toJSON(wrapper))

.contentType(MediaType.MULTIPART_FORM_DATA))

.andExpect(status().isOk());

但是我遇到这样的错误,它说:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data' not supported

是否有人对@RequestBody如何使用分段文件上传有个好主意?我在上面做错了什么吗?

回答:

实际上,您可以在这里简化生活,因为您要做的只是提交包含某些字段和文件的表单。你

需要为你正在尝试做@RequestBody。您可以使用常规的Spring MVC功能,因此您的控制器方法如下所示:

@ResponseBody

public WebResponse<Boolean> updateEUSettings(

Locale locale,

@Valid EUPSettingsWrapper endUserPortalSettingsWrapper,

@RequestParam(value = "file1", required = true) MultipartFile logo

) {

}

向此控制器提交请求的客户端将需要具有的表单enctype="multipart/form-data"

在您的Spring MVC测试中,您将编写如下内容:

getMockMvc().perform(fileUpload(uri).file("file1", "some-content".getBytes()) 

.param("someEuSettingsProperty", "someValue")

.param("someOtherEuSettingsProperty", "someOtherValue")

.accept(MediaType.APPLICATION_JSON)

.contentType(MediaType.MULTIPART_FORM_DATA))

.andExpect(status().isOk());

以上是 Spring Controller @RequestBody可以上传文件吗? 的全部内容, 来源链接: utcz.com/qa/436072.html

回到顶部