当前位置: 首页 > 知识库问答 >
问题:

Spring控制器@RequestBody,可以上传文件吗?

仲孙鸣
2023-03-14

我有一个这样的控制器,我想提交一个带有文件上传的表单,以及一些表单数据,如下图所示的标签。此外,我想使用@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一起使用吗?上面我做错了什么?

共有3个答案

常子濯
2023-03-14

我找不到使用@RequestBody的方法

但是,您可以这样做:

@RequestMapping(value = "/uploadStuff", method = RequestMethod.POST)
public MyViewDto doStuff(@RequestPart("json") @Valid MyDto dto,
                         @RequestPart("file") MultipartFile file) { ... }

您可以这样测试:

MockMultipartFile jsonFile = new MockMultipartFile("json", "",
            "application/json", "{}".getBytes());
MockMultipartFile dataFile = new MockMultipartFile("file", "foo.zip", "application/octet-stream", bytes);

mockMvc.perform(fileUpload("/uploadStuff")
            .file(dataFile)
            .file(jsonFile))
            .andExpect(status().isOk());
缑智敏
2023-03-14

请在spring servlet中添加以下bean。xml添加对多部分请求的支持。

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

另外不要忘记添加对Commons-fileupload jar的依赖项

东方智敏
2023-03-14

您实际上可以在这里简化您的生活,因为您所做的只是提交一个包含一些字段和文件的表单。您不需要@Request estBody来完成您要做的事情。您可以使用常规的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());
 类似资料:
  • 我想上传多个文件到服务器。这是我的角度代码: 控制器的一部分: 问题是在控制器中: “files”列表总是空的(我也尝试了MultipartFile[]而不是list)。只有在指令中返回的不是所有文件,而是一个文件时,它才有效,例如: 代替

  • 我有一个SpringRest网络应用程序,包含一个通用的Rest控制器,如下所示。在Jackson将对象序列化到JSON的情况下,GET方法运行良好。但是,当我尝试调用保存方法时,请求体参数将被转换为LinkedHashMap,而不是由T泛型类型定义的类型。 JSON: 我得到以下错误: HTTP状态500-请求处理失败;嵌套异常是org.springframework.beans.NotRead

  • 我正在使用MulterV1.3.0和ExpressV4.15.4。 我已经使用了文件化限制,如下所示 > 在这种情况下,我不认为限制起作用。导致未获得任何LIMIT_FILE_SIZE错误。 如果删除fileFilter,则会出现LIMIT_FILE_SIZE错误。 但在这两种情况下,首先要上传整个文件&然后检查fileSize。 上传一个1GB的文件,然后检查它的1MB或不是,这一点都不好。所以

  • 问题内容: 是否需要包装支持对象?我想做这个: 并使用这样的JSON: 但是我必须使用: 然后使用以下JSON: 那是对的吗?我的另一种选择是将更RequestMethod改为GET并@RequestParam在查询字符串中使用或@PathVariable与一起使用RequestMethod。 问题答案: 你是正确的,@ RequestBody带注释的参数应该可以容纳请求的整个内容并绑定到一个对象

  • 我们最近从nginx入口控制器从0.8.2升级到0.11.0,并开始在大约10 MB或更高的大文件上传时出现502个坏网关错误,我们已将client_max_body_size设置为通过confimap中的proxy-body size500m并验证其设置。5-6 MB左右的较小文件工作正常。 日志中没有错误,只有这些消息。 修订-[修订]-[2018年3月25日:02:08:49 0000]“发

  • 我有一个ASP。NET文件上载控件,当您单击上载按钮选择要上载的文件时,该控件将打开一个窗口。但问题是,网络驱动程序无法识别窗口,因此无法选择要上载的文件。 我在stackoverflow中找到了许多使用sendkey输入文件路径的解决方案。我认为当你有html文件上传控制时,这是有效的。在我的情况下,我有ASP。NET文件上传控件,它没有文本框,我可以在其中使用sendkey输入文件路径。 我该