在Springboot用apache commons包的ServerFileUpload.parseRequest接收文件上传踩坑经历

  1. 发现bug

    1. 前端正常收到200 response,但Filename 是null。说明后端虽然没有报错,但也没有接收到文件。
  2. 查bug

    1. 确定前端包含正确数据
      1. 用 request.getParameterMap() 解析打印出request中的所有参数,发现文件信息都在里面。说明前端没有问题。
    2. 定位后端问题位置
      1. 在方法中用print statement的方式,判断哪里出了问题。最终问题定位到ServerFileUpload.parseRequest 得到的返回值为空。
      2. 在*上找到问题答案。需要禁用spring框架自带的MultipartResolver。因为request只能被接收一次,该resolver先把request 接收了,我自己定义的ServerFileUpload.parseRequest就不能再接收request了。所以方法的返回值就是空。
  3. 解决方案

    1. 在spring的配置文件:application.properties中禁用multipart:

      spring.servlet.multipart.enabled=false
          
      

      https://*.com/questions/32782026/springboot-large-streaming-file-upload-using-apache-commons-fileupload

  4. 原理分析

    1. MultipartResolver其实是spring框架的一个接口,它可以帮助我们上传文件。它有两个实现,分别是Apache Commons FileUpload的CommonsMultipartResolver和Servlet 3.0 的StandardServletMultipartResolver

    在Springboot用apache commons包的ServerFileUpload.parseRequest接收文件上传踩坑经历

    链接:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartResolver.html

    1. 虽然官网说没有default resolver implementation used,但从我这个bug来看spring默认使用的就是第二种resolver,这篇博客也有相同观点https://www.codenong.com/cs109624474/
  5. 挖坑

    1. 下次用spring自带的servlet3.0实现一下文件上传,比较二者优劣。
上一篇:当“双十一”遇上“速冻寒潮”快递还能如约到吗?


下一篇:springboot 搭建多模块调用以及打包执行