springboot Current request is not a multipart request

springboot 报错:Current request is not a multipart request
这个一般是controller是带有上传文件的服务,类似@RequestParam MultipartFile[] file

解决:

首先检查请求头中的Content-Type是否设置对,如果把Content-Type设置成application/json是不行的

需要把Content-Type设置成multipart/form-data或着去掉Content-Type。
注意,去掉Content-Type,我自己测试的时候是不行的,但看很多网友都说可以,在此记录一下。

还有一种可能就是你的请求url,是https的,而你用了http,也会报这个错误。

反思

通过spring源码,我们看到报这个错误的地方在RequestParamMethodArgumentResolver类的handleMissingValue方法中。
springboot Current request is not a multipart request
看上图,只有servletRequest为null,或者后面的MultipartResolutionDelegate.isMultipartRequest(servletRequest)是false,才会报这个错,我们再看看MultipartResolutionDelegate.isMultipartRequest这个方法的逻辑:
springboot Current request is not a multipart request
看到这里,是不是很清晰了,就是简单的判断请求头里的Content-Type,是不是以“multipart/”开头的

而且,其实正常的请求,是进不到这个handleMissingValue方法的,我们再往前看这个方法的调用的地方:

在AbstractNamedValueMethodArgumentResolver类的resolveArgument方法中,有下图这个逻辑:
springboot Current request is not a multipart request
我们可以看到,只有当入参的值arg为空,并且也没有默认值,还要必传的情况下,才会报这个错。

所以,我们可以得到这个结论:凡是报这个Current request is not a multipart request错的,其本质都是服务解析不到入参值,且这个值必传,也没有默认值。
Content-Type设置错会这样,https误写成http也会这样,或许还有其他可能,但原理都是一样的。