springboot 3.x MultipartFile 参数总是为空 参数传递不进来

{

"code": 500,

"message": "Required part 'file' is not present.",

"result": null,

"type": "error"

}

代表其实servlet请求体里根本没有这个文件流参数,跟文件名和参数名没有太大关系,而且文件上传springboot是默认打开的,也不需要显示的去打开

# 数据源配置

servlet:

multipart:

enabled: true

max-file-size: 20MB

max-request-size: 20MB

之后一直根据这个报错信息去查找相关文档,发现出现这个问题的有很多种原因,那就一个一个去排查

1.前后端参数名对应不一致2.spring.servlet.multipart.enabled=false即关闭文件上传支持3.配置文件中指定了文件上传时的大小值问题4.切换内嵌容器tomcat到undertow的配置问题5.spring.servlet.multipart.location=/tmp指定了临时文件站,但路径不存在6.多次读取HttpServletRequest流7.springboot已经有CommonsMultipartResolver,需要排除原有的Multipart配置@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})

一个个排查之后,发现自己在请求体到接口之前就被使用过多次,很符合多次读取HttpServletRequest流的问题

就是这里使用了:

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.nio.charset.StandardCharsets;

/**

* CachedBodyHttpServletRequest 扩展了 HttpServletRequestWrapper 类,

* 用于缓存请求体,使其可以被多次读取。

*/

public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {

private final byte[] cachedBody;

/**

* 构造函数,读取请求体并进行缓存。

*

* @param request 原始的 HttpServletRequest

* @throws IOException 如果发生 I/O 错误

*/

public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {

super(request);

// 读取请求体并将其转换为字节数组

InputStream requestInputStream = request.getInputStream();

this.cachedBody = requestInputStream.readAllBytes();

}