大家好,我是小白学编程。
最近写一个小程序,有一个上传图片的功能,在本地测试时都好使,使用开发工具上传好用,使用 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
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去除内嵌tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
2、引入 Tomcat9.0.33
<!-- 添加特定版本的Tomcat9.0.33依赖 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.33</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.33</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>9.0.33</version>
</dependency>
山重水复疑无路,柳暗花明又一村
希望这篇文章可以帮助你