the request was rejected because its size (1360408633) exceeds the configured maximum (52428800)
一.前言
当我们用Postman将某文件当参数请求上传文件接口的时候出现了错误,下面我们来复现它。
1.1.Postman请求
我们用postman发送请求,返回值如下所示。
1.2.服务器日志
我们打开后端可以看到日志报出了如下错误。
二.排查问题
2.2.上网查阅
通过查阅资料我们了解到了是因为MultipartConfigElement的配置出现了问题。
2.1.配置类
因为刚用MultipartConfigElement类用的都是默认配置,而默认配置中上传文件大小限制是开启的,单个文件限制为1M,而且最大的请求总文件大小限制是10M,该配置类如下所示。
package org.springframework.boot.autoconfigure.web.servlet;
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.util.unit.DataSize;
/**
* 配置MultipartConfigElement时要使用的属性。
*/
@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
public class MultipartProperties {
/**
* 是否启用对多部分上传的支持。
*/
private boolean enabled = true;
/**
* 上载文件的中间位置。
*/
private String location;
/**
* 单个文件限制。
*/
private DataSize maxFileSize = DataSize.ofMegabytes(1);
/**
* 请求总文件大小限制。
*/
private DataSize maxRequestSize = DataSize.ofMegabytes(10);
/**
* 将文件写入磁盘的阈值。
*/
private DataSize fileSizeThreshold = DataSize.ofBytes(0);
/**
* 是否在访问文件或参数时延迟解析多部分请求。
*/
private boolean resolveLazily = false;
public boolean getEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getLocation() {
return this.location;
}
public void setLocation(String location) {
this.location = location;
}
public DataSize getMaxFileSize() {
return this.maxFileSize;
}
public void setMaxFileSize(DataSize maxFileSize) {
this.maxFileSize = maxFileSize;
}
public DataSize getMaxRequestSize() {
return this.maxRequestSize;
}
public void setMaxRequestSize(DataSize maxRequestSize) {
this.maxRequestSize = maxRequestSize;
}
public DataSize getFileSizeThreshold() {
return this.fileSizeThreshold;
}
public void setFileSizeThreshold(DataSize fileSizeThreshold) {
this.fileSizeThreshold = fileSizeThreshold;
}
public boolean isResolveLazily() {
return this.resolveLazily;
}
public void setResolveLazily(boolean resolveLazily) {
this.resolveLazily = resolveLazily;
}
/**
* 使用属性创建一个新的MultipartConfigElement。
*/
public MultipartConfigElement createMultipartConfig() {
MultipartConfigFactory factory = new MultipartConfigFactory();
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
map.from(this.fileSizeThreshold).to(factory::setFileSizeThreshold);
map.from(this.location).whenHasText().to(factory::setLocation);
map.from(this.maxRequestSize).to(factory::setMaxRequestSize);
map.from(this.maxFileSize).to(factory::setMaxFileSize);
return factory.createMultipartConfig();
}
}
三.解决问题
3.1.解决思路
我们只需要将配合文件中单个文件限制和请求总文件大小限制设置大一些就好了。
3.2.配置文件
因为我们刚刚上传文件大小为1.29G,所以我们这里配置将请求总文件大小限制设置为了1300M。
#文件上传开关
spring.servlet.multipart.enabled=true
#单个文件限制
spring.servlet.multipart.max-file-size=1300MB
#请求总文件大小限制
spring.servlet.multipart.max-request-size=1300MB
#阈值,超过后文件将被写入磁盘
spring.servlet.multipart.file-size-threshold=2KB
四.测试
4.1.Postman请求
我们用postman用相同的文件作为参数再次请求该接口返回值如下所示。
4.2.服务器日志
我们接着查看后端日志可以看到上传成功了,如下所示
4.2.文件
我们打开4.2打印出的未文件所在路径,可以看到文件在这里。