package cn.exrick.xboot.file.controller; import cn.exrick.xboot.core.common.constant.CommonConstant; import cn.exrick.xboot.core.common.constant.SettingConstant; import cn.exrick.xboot.core.common.exception.LimitException; import cn.exrick.xboot.core.common.limit.RedisRaterLimiter; import cn.exrick.xboot.core.common.utils.Base64DecodeMultipartFile; import cn.exrick.xboot.core.common.utils.CommonUtil; import cn.exrick.xboot.core.common.utils.IpInfoUtil; import cn.exrick.xboot.core.common.utils.ResultUtil; import cn.exrick.xboot.core.common.vo.Result; import cn.exrick.xboot.core.entity.Setting; import cn.exrick.xboot.core.service.SettingService; import cn.exrick.xboot.core.vo.OssSetting; import cn.exrick.xboot.file.entity.File; import cn.exrick.xboot.file.manage.FileManageFactory; import cn.exrick.xboot.file.service.FileService; import cn.hutool.core.util.StrUtil; import com.google.gson.Gson; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.InputStream; /** * @author Exrickx */ @Slf4j @RestController @Api(tags = "文件上传接口") @RequestMapping("/xboot/upload") @Transactional public class UploadController { @Value("${xboot.maxUploadFile}") private Integer maxUploadFile; @Autowired private RedisRaterLimiter redisRaterLimiter; @Autowired private IpInfoUtil ipInfoUtil; @Autowired private FileManageFactory fileManageFactory; @Autowired private SettingService settingService; @Autowired private FileService fileService; @RequestMapping(value = "/file", method = RequestMethod.POST) @ApiOperation(value = "文件上传") public Result upload(@RequestParam(required = false) MultipartFile file, @RequestParam(required = false) String base64, HttpServletRequest request) { if (file.getSize() > maxUploadFile * 1024 * 1024) { return ResultUtil.error("文件大小过大,不能超过" + maxUploadFile + "MB"); } Setting setting = settingService.get(SettingConstant.OSS_USED); if (setting == null || StrUtil.isBlank(setting.getValue())) { return ResultUtil.error(501, "您还未配置OSS存储服务"); } // IP限流 在线Demo所需 5分钟限1个请求 // Boolean token = redisRaterLimiter.acquireByRedis("upload:" + ipInfoUtil.getIpAddr(request), 1L, 300000L); // if (!token) { // throw new LimitException("上传那么多干嘛,等等再传吧"); // } if (StrUtil.isNotBlank(base64)) { // base64上传 file = Base64DecodeMultipartFile.base64Convert(base64); } String result = ""; String fKey = CommonUtil.renamePic(file.getOriginalFilename()); File f = new File(); try { InputStream inputStream = file.getInputStream(); // 上传至第三方云服务或服务器 result = fileManageFactory.getFileManage(null).inputStreamUpload(inputStream, fKey, file); // 保存数据信息至数据库 f.setLocation(getType(setting.getValue())).setName(file.getOriginalFilename()).setSize(file.getSize()) .setType(file.getContentType()).setFKey(fKey).setUrl(result); fileService.save(f); } catch (Exception e) { log.error(e.toString()); return ResultUtil.error(e.toString()); } if (setting.getValue().equals(SettingConstant.LOCAL_OSS)) { OssSetting os = new Gson().fromJson(settingService.get(SettingConstant.LOCAL_OSS).getValue(), OssSetting.class); result = os.getHttp() + os.getEndpoint() + "/" + f.getId(); } return ResultUtil.data(result); } public Integer getType(String type) { switch (type) { case SettingConstant.QINIU_OSS: return CommonConstant.OSS_QINIU; case SettingConstant.ALI_OSS: return CommonConstant.OSS_ALI; case SettingConstant.TENCENT_OSS: return CommonConstant.OSS_TENCENT; case SettingConstant.MINIO_OSS: return CommonConstant.OSS_MINIO; case SettingConstant.LOCAL_OSS: return CommonConstant.OSS_LOCAL; default: return -1; } } }