-
发现bug
- 前端正常收到200 response,但Filename 是null。说明后端虽然没有报错,但也没有接收到文件。
-
查bug
- 确定前端包含正确数据
- 用 request.getParameterMap() 解析打印出request中的所有参数,发现文件信息都在里面。说明前端没有问题。
- 定位后端问题位置
- 在方法中用print statement的方式,判断哪里出了问题。最终问题定位到ServerFileUpload.parseRequest 得到的返回值为空。
- 在*上找到问题答案。需要禁用spring框架自带的MultipartResolver。因为request只能被接收一次,该resolver先把request 接收了,我自己定义的ServerFileUpload.parseRequest就不能再接收request了。所以方法的返回值就是空。
- 确定前端包含正确数据
-
解决方案
-
在spring的配置文件:application.properties中禁用multipart:
spring.servlet.multipart.enabled=false
-
-
原理分析
- MultipartResolver其实是spring框架的一个接口,它可以帮助我们上传文件。它有两个实现,分别是Apache Commons FileUpload的CommonsMultipartResolver和Servlet 3.0 的StandardServletMultipartResolver
- 虽然官网说没有default resolver implementation used,但从我这个bug来看spring默认使用的就是第二种resolver,这篇博客也有相同观点https://www.codenong.com/cs109624474/
-
挖坑
- 下次用spring自带的servlet3.0实现一下文件上传,比较二者优劣。