> 技术文档 > 解决 Processing of multipart/form-data request failed. Stream ended unexpectedly 问题

解决 Processing of multipart/form-data request failed. Stream ended unexpectedly 问题

大家好,我是小白学编程。

最近写一个小程序,有一个上传图片的功能,在本地测试时都好使,使用开发工具上传好用,使用 postman 上传也好使。上线以后,使用开发工具上传偶尔好使,偶尔不好使,使用 postman 也是偶尔好使,偶尔不好使。

        我记录一下我当时的处理过程,可能很无聊,想要快速查看结论的可以直接看结论。

1、背景

        我的小程序是使用原生微信小程序,使用的官方的开发工具写的前端。后端服务使用 java 实现的。

        我的服务端环境

依赖 版本 SpringBoot 2.2.5.RELEASE spring-cloud-starter-oauth2 2.2.5.RELEASE druid-spring-boot-starter 1.2.11 mybatis-plus-boot-starter 3.5.3.1

        我的前端环境

                微信小程序基础库 3.3.5

        

        在开发上传图片功能时,微信小程序 API 使用的是

        wx.chooseMedia  和  wx.uploadFile

        服务端使用 MultipartFile file  接收的文件

2、现象

        上传图片时,在本地测试时,使用 http 协议测试时,使用开发工具上传成功,使用postman上传成功,使用手机测试成功;使用 https 协议测试时,使用开发工具上传成功,使用postman上传成功,真机测不了(我还不知道为啥)

        把服务端部署到服务器上后,直接使用的 https 协议了,因为微信小程序要求必须是 https 协议。使用开发工具测试偶尔能成功,偶尔就是失败,使用 postman 测试也是一样,使用手机测试基本上都不成功。但是如果上传的图片很小,10K 以内的图片每次都能成功。

每次上传图片报错Processing of multipart/form-data request failed. Stream ended unexpectedly

3、过程

3.1、猜想调试一       

一开始怀疑是不是上传的图片有大小限制,难道超过10K的图片就不让上传了?于是调整服务端的配置

server: tomcat: max-swallow-size: -1 #设置tomcat没有限制大小spring: servlet: multipart: # 设置multipart属性以允许较大的文件上传 max-file-size: 10MB max-request-size: 10MB

  调成完这些配置以后,测试结果还是一样的,没有成功。

3.2、猜想调试二

        我本地开发时使用的的 JDK11,但是我上线部署时使用的是 JDK8 部署的,难道是JDK版本不同导致的,于是我更换了上线的 JDK 版本,换成了 JDK11。

        调整完测试,还是一样,没成功。

3.3、猜想调试三

        我的服务端实在阿里云服务器上使用 docker 部署的,难道是docker 部署有啥限制吗,不应该呀,网上查了一下也没有看到又说 docker 有啥限制的。服务端在运行时使用 

docker stats {容器ID}

命令查看容器的运行参数,发现各个参数都正常

        

3.4、猜想调试四

        我在启动工程时没有指定 JVM 参数,难道时运行时内存不足了,于是调整了一下 JVM 参数

CMD java -Xms128m -Xmx512m -jar app.jar > log/zzj.log

        调整完测试,还是一样,没成功

还尝试过别的方式,调整前端方法,更换手机等方法,这个问题困扰了我好长时间,在网上查询这个错误也没有找到相应的解决办法。就在今天晚上,我又找解决办法,终于看到了一棵救命稻草,说到可能是 tomcat 9.0.31的问题,正好我使用的框架中的内置 tomcat 刚好是这个版本,于是就尝试了一下。卧槽,好使了!这个问题已经困扰我好久了,终于解决了!

        如过你也遇到了这个错误,也看看是不是使用的 tomcat9.0.31,如果是可以看一下结论进行处理了

4、结论

        经过我两天的寻找,终于在网上找到了一篇文章,原文地址如下:

使用https上传时出现Processing of multipart/form-data request failed. Stream ended unexpectedly的报错

        在 HTTPS 协议上传图片时,Tomcat9.0.31 有 bug,就会报这个错,把 Tomcat 换成 9.0.33版本就可以了,在9.0.33版本中,这个 bug 已经修复了。

替换方式如下:

1、排除SpringBoot中内置的tomcat

 org.springframework.boot spring-boot-starter-web    org.springframework.boot spring-boot-starter-tomcat  

2、引入 Tomcat9.0.33

 org.apache.tomcat.embed tomcat-embed-core 9.0.33 org.apache.tomcat.embed tomcat-embed-el 9.0.33 org.apache.tomcat.embed tomcat-embed-websocket 9.0.33

山重水复疑无路,柳暗花明又一村

希望这篇文章可以帮助你