diff --git a/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java index f50ea4e..1513c64 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java @@ -62,25 +62,25 @@ public class BizException extends RuntimeException { } public static void error(boolean b, CodeEnum returnCode) { - if (b) { + if (!b) { throw new BizException(returnCode.getCode(), returnCode.getMessage(), null); } } public static void error(boolean b, CodeEnum returnCode, String message) { - if (b) { + if (!b) { throw new BizException(returnCode.getCode(), message, null); } } public static void error(boolean b, Integer code, String message) { - if (b) { + if (!b) { throw new BizException(code, message, null); } } public static void error(boolean b, Integer code, String message, Object data) { - if (b) { + if (!b) { throw new BizException(code, message, data); } } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java index 0503b8f..00d1b7b 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java @@ -16,5 +16,5 @@ public interface AppChannelBucketManager { * @param appCode appcode * @return */ - List getByAppCode(String appCode); + AppChannelBucket getByAppCode(String appCode); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java index ff7e6fd..be1a250 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java @@ -1,5 +1,6 @@ package cn.axzo.oss.manager.api; +import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.FileChannel; import java.util.List; @@ -21,8 +22,8 @@ public interface FileChannelManager { /** * 返回一个最优的渠道 升序第一个 * - * @param channelCodes + * @param appChannelBuckets * @return */ - FileChannel getOptimalChannel(List channelCodes); + FileChannel getOptimalChannel(List appChannelBuckets ); } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java index 2afbf9b..0e2b155 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java @@ -3,8 +3,10 @@ package cn.axzo.oss.manager.impl; import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.dal.entity.AppChannelBucket; +import cn.axzo.oss.dal.entity.FileChannel; import cn.axzo.oss.dal.repository.AppChannelBucketDao; import cn.axzo.oss.manager.api.AppChannelBucketManager; +import cn.axzo.oss.manager.api.FileChannelManager; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +24,9 @@ public class AppChannelBucketManagerImpl implements AppChannelBucketManager { @Autowired private AppChannelBucketDao appChannelBucketDao; + @Autowired + private FileChannelManager fileChannelManager; + /** * 通过appcode获取文件渠道桶信息 * @@ -29,9 +34,18 @@ public class AppChannelBucketManagerImpl implements AppChannelBucketManager { * @return */ @Override - public List getByAppCode(String appCode) { + public AppChannelBucket getByAppCode(String appCode) { List appChannelBuckets = appChannelBucketDao.getByAppCode(appCode); BizException.isEmpty(appChannelBuckets, CodeEnum.APP_CHANNEL_BUCKET_NOT_FOUND); - return appChannelBuckets; + + // 找到最优渠道 + FileChannel fileChannel = fileChannelManager.getOptimalChannel(appChannelBuckets); + + AppChannelBucket appChannelBucket = appChannelBuckets.stream().filter(bucket -> + bucket.getChannelCode().equals(fileChannel.getChannelCode())) + .findFirst().orElse(null); + BizException.isEmpty(appChannelBucket, CodeEnum.APP_CHANNEL_NOT_FOUND); + + return appChannelBucket; } } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java index 0e913ba..529d680 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java @@ -2,9 +2,12 @@ package cn.axzo.oss.manager.impl; import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.FileChannel; import cn.axzo.oss.dal.repository.FileChannelDao; import cn.axzo.oss.manager.api.FileChannelManager; +import com.google.common.collect.Lists; +import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -38,12 +41,15 @@ public class FileChannelManagerImpl implements FileChannelManager { /** * 返回一个最优的渠道 升序第一个 * - * @param channelCodes + * @param appChannelBuckets * @return */ @Override - public FileChannel getOptimalChannel(List channelCodes) { - List fileChannels = fileChannelDao.getByChannelCode(channelCodes); + public FileChannel getOptimalChannel(List appChannelBuckets ) { + ArrayList channels = Lists.newArrayList(); + appChannelBuckets.forEach(appChannelBucket -> channels.add(appChannelBucket.getChannelCode())); + + List fileChannels = fileChannelDao.getByChannelCode(channels); BizException.isEmpty(fileChannels, CodeEnum.APP_CHANNEL_NOT_FOUND); return fileChannels.get(0); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 03e81c4..f728321 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -104,7 +104,7 @@ public class FileServiceImpl implements FileService { private void checkAppCode(final String appCode) { log.info("checkAppCode appCode = {}", appCode); FileApp fileApp = fileAppDao.getByAppCode(appCode); - BizException.error(Utility.objIsNull(fileApp), CodeEnum.APP_CODE_NOT_FOUND); + BizException.error(Utility.objIsNotNull(fileApp), CodeEnum.APP_CODE_NOT_FOUND); } /** @@ -120,20 +120,7 @@ public class FileServiceImpl implements FileService { checkAppCode(dto.getAppCode()); // 通过appcode获取文件渠道桶信息 - List appChannelBuckets = appChannelBucketManager - .getByAppCode(dto.getAppCode()); - - // 暂无权限判断 - - // 找到最优渠道 - ArrayList channels = Lists.newArrayList(); - appChannelBuckets.forEach(appChannelBucket -> channels.add(appChannelBucket.getChannelCode())); - FileChannel fileChannel = fileChannelManager.getOptimalChannel(channels); - - AppChannelBucket appChannelBucket = appChannelBuckets.stream().filter(bucket -> - bucket.getChannelCode().equals(fileChannel.getChannelCode())) - .findFirst().orElse(null); - BizException.isEmpty(appChannelBucket, CodeEnum.APP_CHANNEL_NOT_FOUND); + AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(dto.getAppCode()); // 通过渠道桶编码获取到具体文件业务场景 FileBusinessScene scene = fileBusinessSceneManager @@ -143,48 +130,10 @@ public class FileServiceImpl implements FileService { FileUploadConfig fileUploadConfig = fileUploadConfigManager .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); - // 判断容量 - String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length, - dto.getFileName()); + // 上传文件并生成file对象 + File ossFile = generateFile(fileUploadConfig, dto); - File ossFile = new File(); - ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo()); - ossFile.setAppCode(fileUploadConfig.getAppCode()); - ossFile.setChannelCode(fileUploadConfig.getChannelCode()); - ossFile.setBucketName(fileUploadConfig.getBucketName()); - ossFile.setDirectory(fileUploadConfig.getDirectory()); - ossFile.setFileMd5(Utility.getMd5(dto.getFileContent())); - ossFile.setStatus(FileStatusEnum.STATUS_PROCESSING.getCode()); - ossFile.setFileFormat(fileConform); - ossFile.setFileName(dto.getFileName()); - ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); - ossFile.setStorageSize(fileUploadConfig.getStorageSize()); - - String uuid = Utility.getUUID(); - - // 生成上传文件的唯一key - String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); - - String fileUrl = fileManager.uploadByStream( - fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileContent()); - if (Utility.isBlank(fileUrl)) { - ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); - fileDao.save(ossFile); - throw new BizException(CodeEnum.FILE_UPLOAD_FAILED); - } - - ossFile.setFileUuid(uuid); - ossFile.setFileUrl(fileUrl); - ossFile.setUrlMd5(Utility.getMd5(fileUrl)); - ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode()); - fileDao.save(ossFile); - - ServerFileUploadResponse response = new ServerFileUploadResponse(); - response.setUrl(ossFile.getFileUrl()); - response.setUrlMd5(ossFile.getUrlMd5()); - response.setFileKey(ossFile.getFileUuid()); - - return response; + return setResponse(ossFile); } /** @@ -194,18 +143,68 @@ public class FileServiceImpl implements FileService { // 文件大小超出上限 int size = Utility .capacityConversion(fileUploadConfig.getStorageSize(), fileUploadConfig.getStorageUnit()); - BizException.error(fileLength > size, CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); + BizException.error(size > fileLength, CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); // 文件格式判断 String[] formats = fileUploadConfig.getFileFormat().split(CommonConstants.COMMA); int lastIndexOf = fileName.lastIndexOf(CommonConstants.DOT); - BizException.error(lastIndexOf == CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); + BizException + .error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); // 是否包含指定格式 String fileFormat = fileName.substring(lastIndexOf + CommonConstants.ONE).toLowerCase(); boolean contains = Arrays.asList(formats).contains(fileFormat); - BizException.error(!contains, CodeEnum.FILE_FORMAT_NOT_SUPPORTED); + BizException.error(contains, CodeEnum.FILE_FORMAT_NOT_SUPPORTED); return fileFormat; } + + private File generateFile(FileUploadConfig fileUploadConfig, ServerFileUploadDto dto) { + // 判断容量 + String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length, + dto.getFileName()); + + String uuid = Utility.getUUID(); + + // 生成上传文件的唯一key + String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); + + File ossFile = new File(); + ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo()); + ossFile.setAppCode(fileUploadConfig.getAppCode()); + ossFile.setChannelCode(fileUploadConfig.getChannelCode()); + ossFile.setBucketName(fileUploadConfig.getBucketName()); + ossFile.setDirectory(fileUploadConfig.getDirectory()); + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); + ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); + ossFile.setStorageSize(fileUploadConfig.getStorageSize()); + ossFile.setFileFormat(fileConform); + // 上传文件 + String fileUrl = fileManager.uploadByStream( + fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileContent()); + + // 保存失败 + if (Utility.isBlank(fileUrl)) { + fileDao.save(ossFile); + throw new BizException(CodeEnum.FILE_UPLOAD_FAILED); + } + + ossFile.setFileUuid(uuid); + ossFile.setFileUrl(fileUrl); + ossFile.setUrlMd5(Utility.getMd5(fileUrl)); + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode()); + ossFile.setFileName(dto.getFileName()); + ossFile.setFileMd5(Utility.getMd5(dto.getFileContent())); + fileDao.save(ossFile); + return ossFile; + } + + private ServerFileUploadResponse setResponse(File ossFile){ + ServerFileUploadResponse response = new ServerFileUploadResponse(); + response.setUrl(ossFile.getFileUrl()); + response.setUrlMd5(ossFile.getUrlMd5()); + response.setFileKey(ossFile.getFileUuid()); + return response; + } + } diff --git a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java index b51677a..1b52bdb 100644 --- a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java +++ b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java @@ -4,12 +4,10 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.test.base.SpringTestBase; -import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.util.ArrayList; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -38,9 +36,9 @@ public class FileServiceTest extends SpringTestBase { ServerFileUploadDto dto = new ServerFileUploadDto(); dto.setAppCode("test"); dto.setBizScene("1"); - dto.setFileName("一个新的文件.jpg"); + dto.setFileName("一个新的文件.xlsx"); - File file = new File("/Users/zhangran/Desktop/xx/IMG_20210728_162815.jpg"); + File file = new File("/Users/admin/Downloads/表扬人员名称.xlsx"); FileInputStream fileInputStream = null; @@ -53,9 +51,10 @@ public class FileServiceTest extends SpringTestBase { } catch (IOException e) { e.printStackTrace(); } +// System.out.println(Arrays.toString(bytes)); dto.setFileContent(bytes); - - fileService.upload(dto); +// +// fileService.upload(dto); }