【问题标题】:Spring file upload - getting Expected MultipartHttpServletRequest: is a MultipartResolver configured? errorSpring 文件上传 - 获得预期的 MultipartHttpServletRequest:是否配置了 MultipartResolver?错误
【发布时间】:2015-01-18 22:18:20
【问题描述】:

我正在尝试使用angular-file-upload 在我的 Angular Web 应用程序中合并多个文件上传功能。目前,前端功能有效,但每次上传尝试都会抛出一个

java.lang.IllegalStateException,java.io.IOException]: 
    java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: 
        is a MultipartResolver configured?

异常。

上传控制器定义为

@Controller
@PropertySource("classpath:application.properties")
public class FileUploadController {

    @Resource
    private Environment env;

    @RequestMapping(value = "/fileupload", method = RequestMethod.POST)
    @ResponseBody
    public List<String> fileUpload(@RequestParam("file") MultipartFile[] uploadFiles) throws IllegalStateException, IOException {
        //file processing logic
    }
 }

在我的 AppConfig.java 类中,我声明了 bean

@Bean
public CommonsMultipartResolver commonsMultipartResolver(){
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
    commonsMultipartResolver.setDefaultEncoding("utf-8");
    commonsMultipartResolver.setMaxUploadSize(50000000);
    return commonsMultipartResolver;
}

并使用

启动 Web 应用程序
@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(AppConfig.class);
    servletContext.addListener(new ContextLoaderListener(ctx));

    ctx.setServletContext(servletContext);
    ctx.refresh();

    Dynamic servlet = servletContext.addServlet(SERVLET_NAME, new DispatcherServlet(ctx));
    servlet.addMapping("/");
    servlet.setLoadOnStartup(1);
    //servlet.setMultipartConfig(ctx.getBean(MultipartConfigElement.class));
}

我认为这不是因为我的 Angular 视图中缺少 &lt;form&gt; 元素,因为我可以看到 Content-Tylemultipart/form-data 并且请求有效负载设置正确。

Remote Address:192.168.33.10:80
Request URL:http://dev.jason.com/rest/fileupload
Request Method:POST
Status Code:500 Internal Server Error
Request Headers
  Accept:*/*
  Accept-Encoding:gzip,deflate
  Accept-Language:en-US,en;q=0.8
  Cache-Control:no-cache
  Connection:keep-alive
  Content-Length:415235
  Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryBHlsldPQysTVpvwZ
  Host:dev.jason.com
  Origin:http://dev.jason.com
  Pragma:no-cache
  Referer:http://dev.jason.com/
  User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36
Request Payload
   ------WebKitFormBoundaryBHlsldPQysTVpvwZ
   Content-Disposition: form-data; name="file"; filename="IMG_5072.jpg"
   Content-Type: image/jpeg

   ------WebKitFormBoundaryBHlsldPQysTVpvwZ--

请注意,包含时仍然会出现此问题

@Bean
public MultipartConfigElement multipartConfigElement(){
    MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory();
    multipartConfigFactory.setMaxFileSize("10MB");
    multipartConfigFactory.setMaxRequestSize("50MB");
    return multipartConfigFactory.createMultipartConfig();
}

AppConfig.java 中并取消注释命令

servlet.setMultipartConfig(ctx.getBean(MultipartConfigElement.class));

在我的 servlet 初始化程序类中。

感谢任何帮助!

【问题讨论】:

  • 一方面,不要同时使用ContextLoaderListenerDispatcherServlet 注册ctx 上下文。
  • 这背后的原因是什么?
  • 好的,但这与当前问题有什么关系?
  • 它没有。这只是建议。在其他情况下,它可能会对您产生负面影响。

标签: java angularjs spring file-upload


【解决方案1】:

Spring 的 MVC 堆栈要求将 MultipartResolver bean 称为 multipartResolver。将您的 @Bean 方法更改为

@Bean
public CommonsMultipartResolver multipartResolver(){

@Bean(name = "multipartResolver")
public CommonsMultipartResolver commonsMultipartResolver(){

【讨论】:

  • 这样一个简单的解决方案可以解决令人沮丧的问题。谢谢!
  • @Jason 令我困扰的是,除了源代码之外,没有任何文档说明这一点。文档中提供的示例仅使用multipartResolver,但没有明确说明(至少不是我读过的)名称必须是multipartResolver
  • 同意,虽然我应该抓住这个。我寻求帮助的几乎所有示例都具有&lt;beans:bean id="multipartResolver"&gt; ... &lt;/beans:bean&gt; 的 XML 配置
  • +1 这是一个不必要的问题。我不知道为什么方法名称必须完全命名为 multipartResolver,也不知道为什么这不是整个文档。
【解决方案2】:

只需将其添加到 servler-context.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize" value="268435456"/>
</bean>

不需要其他任何东西。

【讨论】:

  • 最简单的解决方案!谢谢。
【解决方案3】:

你必须在 webmvc-context.xml 中添加这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多