【发布时间】:2016-10-23 10:10:10
【问题描述】:
我想在我的 Spring Boot 应用程序中实现上传处理程序方法。我想使用CommonsMultipartResolver 而不是StandardServletMultipartResolver。我有以下问题:
我的控制器方法参数(文件)始终设置为空。我在HiddenHttpMethodFilter 的java 文档中看到:
在多部分 POST 请求的情况下,此过滤器需要在多部分处理之后运行,因为它固有地需要检查 POST 正文参数。
我尝试为 multipartFilter bean 设置顺序,但没有帮助。当我调试时,我看到HiddenHttpMethodFilter 总是在MultipartFilter 之前被调用。我正在使用 Spring Boot 版本 1.3.0.RELEASE 和基于 Java 的配置。如何设置HiddenHttpMethodFilter 在MultipartFilter 之后的顺序?
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSizePerFile(52428800);
return resolver;
}
@Bean
@Order(0)
public MultipartFilter multipartFilter() {
MultipartFilter multipartFilter = new MultipartFilter();
multipartFilter.setMultipartResolverBeanName("multipartResolver");
return multipartFilter;
}
@RequestMapping(value = "/{userId}", method = RequestMethod.POST)
@ResponseBody
public FileTransport create(@PathVariable("userId") Long userId,
MultipartFile file) throws IOException {
//return fileService.create(userId, file);
return new FileTransport();
}
如果我修改方法以包含如下请求参数:
@RequestParam(name = "file", required = true) MultipartFile 文件
它抛出一个异常:'Required MultipartFile parameter 'file' is not present'。
如果我使用StandardServletMultipartResolver,一切都会按预期进行。
【问题讨论】:
-
因为discussed on GitHub 已经是你的
MultipartFilter的顺序是错误的。它需要小于HiddenHttpMethodFilter的数量级,即 -10000。如果这没有帮助,你能提供一个minimal, complete, verifiable example吗? -
@AndyWilkinson HiddenHttpMethodFilter 的顺序不是-10000,而是HIGHEST_PRECEDENCE+10。但即使你在它前面设置了 MultipartFilter,上传也会失败,这次是
java.io.IOException: Missing content for multipart request at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:390)。 CommonsMultipartResolver 是否与 Spring Boot 完全兼容? -
@AndyWilkinson spring-boot 版本是 1.2.8。
-
@kpentchev 您使用的是不同版本的 Spring Boot,因此情况可能不一样。评论不是解决问题的正确地方;如果这个问题没有帮助,请提出一个新问题。
标签: spring file-upload spring-boot