
正文
spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
以下是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也会默认生成

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

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

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

临时文件示例

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

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






