点击上方名片关注我,为你带来更多踩坑案例
有一个业务场景,是客户端(类似百度网盘)需要上传文件列表到服务端
然后发现服务端抛了FileSizeLimitExceededException异常,部分文件上传失败
接口如下:
@RequestMapping("file-list")
public ApiResponse<Object> batchUploadAssets(@RequestParam @ApiParam String key,
@RequestParam @ApiParam MultipartFile files) {
}
就是在接收files参数的时候,提示文件过大
这是因为spring对MultipartFile类型的参数是有大小限制的
可以在application中修改这个限制
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
默认应该只有1MB
修改之后限制阈值提高了,但是如果下次出现更大的文件,依旧还会报错
我们可以将其限制为无限大如99999来杜绝报错的出现
但是显然,这是不合理的,因为我们必须对它的大小有限制,不然服务器也处理不了
大家根据自己的业务场景和服务器配置估算好一个合理的最大阈值以后,如果请求中的参数再次超过阈值,给出报错是合理的
但是,对请求方来说,我们需要有一个友好的报错,即约定好的报错code和简洁明了的报错msg
而且这是一个与具体业务耦合性不大的通用逻辑,最好不写在具体的接口中
于是我们可以写一个全局异常类来捕获我们需要抛出的异常,并对其做一个包装处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = MultipartException.class)
@SuppressWarnings("unchecked")
public ApiResponse<Object> handleBusinessException(MaxUploadSizeExceededException ex) {
String msg;
if (ex.getCause().getCause() instanceof FileSizeLimitExceededException) {
log.error(ex.getMessage());
msg = "上传文件过大[单个文件不能超过10M]";
} else if (ex.getCause().getCause() instanceof SizeLimitExceededException) {
log.error(ex.getMessage());
msg = "上传文件过大[总上传文件大小不得超过10M]";
} else {
msg = "上传文件失败";
}
return ApiResponse.fail(Constants.CODE_FILE_SIZE_MAX, msg);
}
如上
ps:ApiResponse是一个接口格式统一封装处理,可以看我的系统设计思路合集,会仔细说明的
END
如果对你有帮助,请关注我,给你带来更多小知识!