首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @RequestBody可以上传文件吗?

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

Stack Overflow用户
提问于 2014-05-08 05:24:13
回答 5查看 96.9K关注 0票数 51

我有一个这样的控制器,我想提交一个表单与文件上传,以及一些表格数据,如标签,如下所示。另外,我希望使用@RequestBody来实现这一点,以便在添加更多变量时,可以在包装器上使用@Valid注释。

代码语言:javascript
复制
public @ResponseBody WebResponse<Boolean> updateEUSettings(
    final Locale locale,
    @Validated @ModelAttribute final EUPSettingsWrapper endUserPortalSettingsWrapper) {
}

我的包装纸是:

代码语言:javascript
复制
public class EUPSettingsWrapper {

    private String label;
    private MultipartFile logo;
// getter , setters..etc...
}

但是我想把它转换成来自ModelAttributes的@RequestBody。

我尝试的方法是将文件上传分离为请求参数,如下所示:

代码语言:javascript
复制
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中,我设置:

代码语言:javascript
复制
getMockMvc().perform(fileUpload(uri).file(logo)
                        .accept(MediaType.APPLICATION_JSON)
                        .content(JSONUtils.toJSON(wrapper))
                        .contentType(MediaType.MULTIPART_FORM_DATA))
                        .andExpect(status().isOk());

但是我遇到了这样一个错误,它说:

代码语言:javascript
复制
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data' not supported

有没有人对@RequestBody如何使用多部分文件上传有一个很好的了解?上面我做错什么了吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-08 06:15:30

你可以在这里简化你的生活,因为你所做的就是提交一个包含一些字段和文件的表单。您不需要@RequestBody来做您想要做的事情。您可以使用常规的Spring功能,因此控制器方法如下所示:

代码语言:javascript
复制
@ResponseBody
public WebResponse<Boolean> updateEUSettings(
     Locale locale, 
     @Valid EUPSettingsWrapper endUserPortalSettingsWrapper, 
     @RequestParam(value = "file1", required = true) MultipartFile logo
) {


}

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

在Spring测试中,您将编写如下所示:

代码语言:javascript
复制
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());
票数 52
EN

Stack Overflow用户

发布于 2014-05-08 05:52:45

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

代码语言:javascript
复制
<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

另外,不要忘记添加commons的依赖项。

票数 12
EN

Stack Overflow用户

发布于 2015-07-31 19:28:44

我找不到使用@RequestBody的方法。

但是,您可以这样做:

代码语言:javascript
复制
@RequestMapping(value = "/uploadStuff", method = RequestMethod.POST)
public MyViewDto doStuff(@RequestPart("json") @Valid MyDto dto,
                         @RequestPart("file") MultipartFile file) { ... }

您可以这样测试它:

代码语言:javascript
复制
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());
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23533355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档