问题补充
安卓5,6,7 安卓最新版微信(8.0.15)基础库2.20.0 该现象发生率 100%
小程序使用wx.uploadFile上传图片到后端,接口调用成功,后端用的MultipartFile接收时候发现缺少boundary参数,后台报错:the request was rejected because no multipart boundary was found,出现的概率大概1%
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
让前端检查,是否在使用了wx.uploadFile时候,自己写了一个content-Type;
出现这个bug的原因是boundary字段缺失,在大部分机型上,微信定义的content-type会在后面,所以不会影响,测试也测不出来,而在小部分机型,自定义的content-type会在后面,导致boundary字段缺失;
解决建议: 不自己添加content-type字段
你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。
麻烦在手机微信那里上传下日志: 我->设置->帮助与反馈右上角有个上报日志的入口,麻烦提供一下微信号,时间点(具体到分钟)
请求的header里设置了两次 "Content-Type" :
1. Content-Type multipart/form-data; boundary=1634796333288
2. content-type multipart/form-data
后一次的content-type没有带boundary导致请求失败了
同样的情况。我们的问题已经解决了。是因为 微信小程序uploadFile方法,HTTP请求中的Content-Type缺少了boundary。
正确的应该是:multipart/form-data; boundary=xxxxx
实际接收到的是:multipart/form-data;
服务端无法根据boundary来区分form-data的fields,因此无法处理请求导致上传发生错误。
我们解决方案:
在网关层编写了一个中间件应用在上传服务器前,判断请求的Content-Type是中不存在boundary时。从Request Body中获取第一行(就是boundary),去掉前缀"--",放到header中。
举例:
Body内容如下:
--1634813444
Content-Disposition: form-data; name="Filedata"; filename="aaa.pdf"; filename*="UTF-8''aa.pdf"
<aa.pdf>
--1634813444
Content-Disposition: form-data; name="resotype"
1
--1634813444--
获取"--1634813444",并去掉前缀"--"。得到 Content-Type: multipart/form-data; boundary=1634813444,服务端就可以正常处理请求。
在请求头里,加一个'X-Requested-With': 'XMLHttpRequest',将请求变为ajax请求,亲测有效