{
"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();
}