我有一个这样的控制器,我想提交一个带有文件上传的表单,以及一些表单数据,如下图所示的标签。此外,我想使用@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的方法。
但是,您可以这样做:
@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());
请在spring servlet中添加以下bean。xml添加对多部分请求的支持。
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
另外不要忘记添加对Commons-fileupload jar的依赖项
您实际上可以在这里简化您的生活,因为您所做的只是提交一个包含一些字段和文件的表单。您不需要@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输入文件路径。 我该