springmvc处理文件无法上传问题

未分类 发表评论


一、问题现象:

1、用postman 上传文件一直报400、500错误,请求截图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、当header设置为 multipart/form-data 请求始终无法到达接口

二、问题排查过程

1、首先我根据返回的400或500 的错误码在网上搜索,查询排查结果。 其搜索到的结果基本上是让检查spring-mvc配置文件中,file类型的解析handler 有没有问题。 我确认了我的配置没有问题。 如图:
在这里插入图片描述
2、我开始怀疑, 我是否引入了jar , 我确认了。 jar已经引入,如下图:
在这里插入图片描述
怀疑是jar版本问题, 我升级到最新jar,问题依然没有解决。 暂时排除jar版本的问题。
3、我怀疑是我们系统集成的统一登录授权系统,过滤到了相应的数据,于是我debug,统一登录授权系统的filter。在debug的时候发现了一个奇诡的现象,刚进入filter的 ServletRequest 请求是有, file类型文件的, 其它的请求参数也有, 顿时,看到了一点希望的曙光,至少数据有传到后台来,排除postman构造请求参数的问题,但是运行了几行代码后我发现,ServletRequest 没有了file文件,及其它参数。
在这里插入图片描述
好几次debug发现问题原因是:是由于ServletRequest 被强制转换为HttpServletRequest,在未转换前应该是MultipartHttpServletRequest,转换后导致multipart/form-data 请求的数据全部丢失。问题点如下图:
在这里插入图片描述
附上查看的代码:org.apache.commons.io.IOUtils.toString(request.getInputStream())
4、原本以为找到了最终的原因,于是注销掉了统一登录授权的filter,结果依然报400错误。 这次真的懵逼了。 于是我开始检查Controller,从error内容中可以看出, 是数据没有被绑定到相应的Controller上。 一下是有问题的写法:
在这里插入图片描述
5、开始在网上查阅资料,最后发现,spring在绑定请求参数的时候只能绑定一个对象, 而我有两个对象。于是去掉一个对象发现 请求居然进到了相应的接口, HttpServletRequest 中也有了相应的参数。 于是我将所有参数都分开接受。如下图:
在这里插入图片描述

三、总结

这次问题排查了一整天,多数时间在网上查阅资料和尝试,我觉得这样处理问题的效率太低了。 处理问题还是得从原理出发,然后看源代码,debug。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *