Spring Boot 默認(rèn)上傳文件大小限制是 1MB,默認(rèn)單次請(qǐng)求大小是 10MB巾表,超出大小會(huì)跑出 MaxUploadSizeExceededException 異常。
問題出現(xiàn)了略吨,當(dāng)文件超過 1M 和超過 10M 時(shí)異常是有區(qū)別的集币,這也是本文所說的重點(diǎn)。
解決方案
spring:
servlet:
multipart:
max-request-size: 15MB #改為自己的想要的
max-file-size: 5MB #改為自己的想要的
enabled: true
server:
tomcat:
max-swallow-size: 100MB #重要的一行翠忠,修改tomcat的吞吐量
注意上面最重要的是要配置內(nèi)嵌的 tomcat 的最大吞吐量即 max-swallow-size鞠苟,可以設(shè)置 -1 不限制,也可以設(shè)置一下比較大的數(shù)字這里我設(shè)置 100M。當(dāng)上傳文件超 tomcat 的大小限制后會(huì)先于 Controller 觸發(fā)異常当娱,所以這時(shí)我們的異常處理類無法捕獲 Controller 層的異常吃既。
使用全局異常處理類來捕獲異常
@RestControllerAdvice
public class GlobalExceptionHandler {
static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = MultipartException.class)
public @ResponseBody
Response handleBusinessException(MaxUploadSizeExceededException ex) {
String msg;
if (ex.getCause().getCause() instanceof FileUploadBase.FileSizeLimitExceededException) {
logger.error(ex.getMessage());
msg = "上傳文件過大[單文件大小不得超過10M]";
} else if (ex.getCause().getCause() instanceof FileUploadBase.SizeLimitExceededException) {
logger.error(ex.getMessage());
msg = "上傳文件過大[總上傳文件大小不得超過10M]";
} else {
msg = "上傳文件失敗";
}
return new Response("-1", msg, null);
}
}