spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

时间:2022-12-25 22:55:20

以下是spring-boot的处理方式,其他可参考处理
具体问题:
1、CommonsMultipartResolver解析不到request中的文件流
2、Controller方法参数MultipartHttpServletRequest.getFiles获取不到文件信息

处理步骤:
1、确认添加解析器配置,如下注解方式配置

@Bean(name = {"multipartResolver"})
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver cmr = new CommonsMultipartResolver();
        cmr.setMaxInMemorySize(1024);
        return cmr;
    }

2、配置ServletRegistrationBean(ServletRegistrationBean中MultipartConfigElement为null),以下是spring-boot配置方式,非spring-boot不需要

@Bean
    public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
        registration.getUrlMappings().clear();
        registration.addUrlMappings("*.do");
        return registration;
    }

如果不加以上代码,默认spring自动配置类生成ServletRegistrationBean,MultipartConfigElement也会默认生成

spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

原因:
1、在spring过滤器,或在CommonsMultipartResolver解析请求信息之前调用了request.getParameter,如下图

spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

2、request.getParameter进入到request的解析方法,假如MultipartConfigElement不为null,往下执行rqeust会将请求参数保存到临时文件

spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

MultipartConfigElement是否为空可在划线处加断点调试

spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

临时文件示例

spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

临时文件具体路径,不同机器可能不一样,具体可参考以下获取

spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

总结:request中上传流被读取到临时文件后,spring的CommonsMultipartResolver解析器再去读已经读不到流信息了