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

标签 spring spring-mvc multipart multipartform-data

我有一个这样的 Controller ,我想提交一个带有文件上传的表单以及一些表单数据,如下所示。另外,我想使用 @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 功能,因此您的 Controller 方法如下所示:

@ResponseBody
public WebResponse<Boolean> updateEUSettings(
     Locale locale, 
     @Valid EUPSettingsWrapper endUserPortalSettingsWrapper, 
     @RequestParam(value = "file1", required = true) MultipartFile logo
) {


}

向该 Controller 提交请求的客户端需要有一个带有 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 可以上传文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23533355/

相关文章:

java - 无法捕获 Spring 中异步方法抛出的异常

xml - spring-beans-3.1.xsd和spring-beans.xsd的spring xml配置区别

java - java属性文件中的多个配置 block

java - 从 spring 3 Controller 发出 http 请求的最佳方法

java - 这个架构定义可以吗?多层(Spring/多数据库)

java - spring中从环境变量指定的路径加载属性文件

python - 在 Twisted 上处理多部分/混合

c# 为 multipartReader.ReadNextSectionAsync() 设置超时

java - Autowiring ,不按类型装配 bean

web-services - Spring MVC @RequestBody 在与@RequestParam MultipartFile 一起使用时给我一个空字符串