一、首先抛出问题
以阿里云oss文件上传为例,假设我的需求是这样的,我需要发布一条动态,这条动态呢可以是图片、语音、视频,3种类型,每种类型的上传我必须要限制它的文件大小,超过了我就不能让他上传的。如果传统的方式,那就是创建3个上传类型bucket对应图片、语音和视频,其实这种做法是可以的,但是怎么说呢,还不够优雅,如果当这个动态有越来越多种类型,你是不是要建立N个类型对应呢,所以就会使得bucket特别的多,不好维护。
二、解决思路
首先,我们可以区分bucket的上传类型大类,比如动态是一个大类,它的子类呢有:图片、语音、视频,3种,每种的上传文件大小的限制是不一样的。文件上传后的位置统一都是放到大类bucketName文件夹上。我们可以建立一个枚举类,该枚举类比较特殊,是存储子分类数组的。code就是大分类,value是子分类数组。
三、直接看源码就懂了,下面是controller
@ApiOperation(value = "上传文件", notes = "bucketName选择[avatar(头像),file(文件),banner,game(游戏),dynamic(动态),room_bg_img(房间背景图)],文件上传按分类管理,其他类型请通知添加")
@PostMapping("/uploadFile")
public ResponseResult<UploadFileDto> uploadFile(@RequestParam MultipartFile file, @RequestParam String bucketName) {
ResponseResult responseResult = ResponseResult.error();
Entry entry = null;
try {
//限流
entry = SphU.entry("uploadFile", EntryType.IN, 1, SessionUtil.getUserId());
//验证是否是可上传的分类
if (!BucketNameLimitSizeEnum.isValidEnum(bucketName)) {
responseResult.setError(ResponseMessage.BUCKET_NAME_NOT_EXIST);
return responseResult;
}
//获取文件限制大小
FileLimitItem[] items = BucketNameLimitSizeEnum.getLimitItemByCode(bucketName);
//判断文件属于什么类型
Integer typeNum = FileTypeUtil.getContentType(file.getOriginalFilename());
//判断该上传类型是哪种类型,并判断是否超过限制
for (FileLimitItem item : items){
if (typeNum == item.getType()){
if (!MultipartFileUtil.checkFileSize(file.getSize(),item.getNum(),"K")){
responseResult.setError(ResponseMessage.FILE_SIZE_BIG);
return responseResult;
}