SpringBoot前后端分离项目开发中,上传文件的功能还是比较常见的。SpringBoot是支持上传文件功能,默认的单个文件大小限制为spring.servlet.multipart.max-file-size=1MB,单个请求限制为spring.servlet.multipart.max-request-size=10MB。项目中可以设置单个文件上传大小限制以及单个请求大小限制,以及文件超过最大限制后返回自定义Restful风格的Json字符串。
功能开发
接口开发比较简单,直接在接口中处理MultipartFile文件参数即可,将接收到的文件存到服务器上,然后返回服务器上存储的上传文件的信息,示例代码如下:
@PostMapping("upload")
@ApiOperation("上传文件")
public ApiResult<String> upload(MultipartFile file) {
if (file != null) {
String fileName = file.getOriginalFilename();
String code = UUID.randomUUID().toString().replaceAll("-", "");
String newFileName = code + fileName.substring(fileName.lastIndexOf('.'));
String currentDateFolder = DateFormatUtils.format(new Date(), "yyyyMMdd");
String destFilePath = "D:/uploads" + File.separator + currentDateFolder + File.separator + newFileName;
try {
File destFile = new File(destFilePath);
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
file.transferTo(destFile);
// 这里直接返回的服务器上的物理地址,项目中需要根据实际情况自行处理
return ApiResult.success(destFilePath);
} catch (IOException e) {
// TODO 异常处理
}
}
// ApiResult为封装的接口统一返回泛型类,项目中根据实际情况处理
return ApiResult.failed();
}
上传文件配置
SpringBoot默认的单个文件大小限制为spring.servlet.multipart.max-file-size=1MB,单个请求限制为spring.servlet.multipart.max-request-size=10MB。默认的文件限制可能不满足项目需求,我们可以设置自己项目的限制,application.yml示例配置如下:
server:
tomcat:
# 内嵌tomcat最大请求吞吐量限制,-1表示没有限制,如果不配置上传文件超过最大限制后tomcat会取消请求,前端的请求将会没有返回
max-swallow-size: -1
spring:
# springboot2.0以后文件大小限制配置
servlet:
# spring默认的上传文件大小限制是1MB,单次请求文件总数不能大于10MB,如果要移除限制设置为-1
multipart:
max-file-size: 20MB #单个文件大小
max-request-size: 100MB #单次请求文件总大小
上面的application.yml配置中我们设置了server.tomcat.max-swallow-size=-1,此设置对于自定义返回非常重要。
文件超过限制异常自定义处理
当上传文件超过限制后,会抛出MaxUploadSizeExceededException异常,一般情况下我们只需要捕获该异常,并返回自定义对象就可以了。但是如果我们直接这样处理,会发现上传接口文件大小超限制后,前端请求无法获取结果,我们自定义的结果没有正常返回,导致前端无法友好的处理显示。这是因为如果我们未设置server.tomcat.max-swallow-size时,上传文件超过大小限制后会被tomcat取消请求,导致没有结果返回。此时我们需要在application.yml中增加server.tomcat.max-swallow-size=-1的设置,该设置的作用是当请求超过限制后,tomcat不要取消该次请求。参考:https://stackoverflow.com/questions/2689989/how-to-handle-maxuploadsizeexceededexception。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ApiResult maxUploadSizeHandler(MaxUploadSizeExceededException exception) {
ApiResult response = ApiResult.validateFailed("上传文件超过最大限制");
return response;
}
}
测试
在Swagger中我们上传一个超过限制大小的文件,文件限制异常会被正确的捕获并返回统一的Json格式错误信息,以便前端处理,测试截图如下:
总结
SpringBoot前后端项目开发文件上传的功能不难,网上也有很多文章讲解,文件大小限制也比较容易通过网上获取。上传文件接口,当超过大小限制异常自定义处理返回Json格式的信息网上的相关内容比较少。这里做一个记录和总结,希望其它网友遇到该问题的时候,能够通过此文获得帮助。如果文中有描述不正确的地方,希望网友及时指正。