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

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

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

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

1、背景

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

        我的服务端环境

依赖版本
SpringBoot2.2.5.RELEASE
spring-cloud-starter-oauth22.2.5.RELEASE
druid-spring-boot-starter1.2.11
mybatis-plus-boot-starter3.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>

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

希望这篇文章可以帮助你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值