Spring文件上传 - 获得预期的MultipartHttpServletRequest:是否配置了MultipartResolver?错误

Jas*_*son 25 java spring file-upload angularjs

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

java.lang.IllegalStateException,java.io.IOException]: 
    java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: 
        is a MultipartResolver configured?
Run Code Online (Sandbox Code Playgroud)

例外.

上传控制器定义为

@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
    }
 }
Run Code Online (Sandbox Code Playgroud)

在我的AppConfig.java课上,我宣布了豆子

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

并启动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));
}
Run Code Online (Sandbox Code Playgroud)

我不认为这是由于<form>我的Angular视图中缺少一个元素,因为我可以看到它Content-Tylemultipart/form-data并且Request Payload设置得恰当.

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--
Run Code Online (Sandbox Code Playgroud)

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

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

进入AppConfig.java和取消注释命令

servlet.setMultipartConfig(ctx.getBean(MultipartConfigElement.class));
Run Code Online (Sandbox Code Playgroud)

在我的servlet初始化类中.

任何帮助表示赞赏!

Sot*_*lis 31

Spring的MVC堆栈需要MultipartResolver调用bean multipartResolver.将您的@Bean方法更改为

@Bean
public CommonsMultipartResolver multipartResolver(){
Run Code Online (Sandbox Code Playgroud)

要么

@Bean(name = "multipartResolver")
public CommonsMultipartResolver commonsMultipartResolver(){
Run Code Online (Sandbox Code Playgroud)


Pat*_*ice 7

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

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize" value="268435456"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

没有别的需要.