springmvc处理文件无法上传问题

本文详细记录了使用POSTMAN上传文件时遇到400错误的排查过程,涉及Spring MVC配置、统一登录授权系统过滤问题及Controller参数绑定错误,最终通过调整参数接收方式解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题现象:

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值