diff --git a/src/main/java/im/zhaojun/aliyun/service/AliyunServiceImpl.java b/src/main/java/im/zhaojun/aliyun/service/AliyunServiceImpl.java index 96be582..7d55b44 100644 --- a/src/main/java/im/zhaojun/aliyun/service/AliyunServiceImpl.java +++ b/src/main/java/im/zhaojun/aliyun/service/AliyunServiceImpl.java @@ -1,32 +1,23 @@ package im.zhaojun.aliyun.service; -import cn.hutool.core.util.URLUtil; -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; -import com.aliyun.oss.model.AccessControlList; -import com.aliyun.oss.model.CannedAccessControlList; -import com.aliyun.oss.model.ListObjectsRequest; -import com.aliyun.oss.model.OSSObjectSummary; -import com.aliyun.oss.model.ObjectListing; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import im.zhaojun.common.config.ZFileCacheConfiguration; +import im.zhaojun.common.model.S3Model; import im.zhaojun.common.model.StorageConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; -import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.service.AbstractS3FileService; import im.zhaojun.common.service.FileService; -import im.zhaojun.common.service.StorageConfigService; -import im.zhaojun.common.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map; @@ -35,52 +26,30 @@ import java.util.Map; */ @Service @CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") -public class AliyunServiceImpl implements FileService { +public class AliyunServiceImpl extends AbstractS3FileService implements FileService { private static final Logger log = LoggerFactory.getLogger(AliyunServiceImpl.class); - @Value("${zfile.cache.timeout}") - private Long timeout; - - @Resource - private StorageConfigService storageConfigService; - - private static final String BUCKET_NAME_KEY = "bucket-name"; - - private static final String ACCESS_KEY = "accessKey"; - - private static final String SECRET_KEY = "secretKey"; - - private static final String DOMAIN_KEY = "domain"; - - private static final String ENDPOINT_KEY = "endPoint"; - - private OSS ossClient; - - private String bucketName; - - private String domain; - - private boolean isPrivate; - - private boolean isInitialized; - @Override public void init() { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.ALIYUN); - String accessKey = stringStorageConfigMap.get(ACCESS_KEY).getValue(); - String secretKey = stringStorageConfigMap.get(SECRET_KEY).getValue(); - String endPoint = stringStorageConfigMap.get(ENDPOINT_KEY).getValue(); + String accessKey = stringStorageConfigMap.get(StorageConfigConstant.ACCESS_KEY).getValue(); + String secretKey = stringStorageConfigMap.get(StorageConfigConstant.SECRET_KEY).getValue(); + String endPoint = stringStorageConfigMap.get(StorageConfigConstant.ENDPOINT_KEY).getValue(); - bucketName = stringStorageConfigMap.get(BUCKET_NAME_KEY).getValue(); - domain = stringStorageConfigMap.get(DOMAIN_KEY).getValue(); - ossClient = new OSSClientBuilder().build(endPoint, accessKey, secretKey); + String bucketName = stringStorageConfigMap.get(StorageConfigConstant.BUCKET_NAME_KEY).getValue(); + String domain = stringStorageConfigMap.get(StorageConfigConstant.DOMAIN_KEY).getValue(); + String basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); + + s3Model = S3Model.builder().bucketName(bucketName).basePath(basePath).domain(domain).build(); + + BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, "oss")).build(); - AccessControlList bucketAcl = ossClient.getBucketAcl(bucketName); - CannedAccessControlList cannedAcl = bucketAcl.getCannedACL(); - isPrivate = "Private".equals(cannedAcl.name()); isInitialized = testConnection(); } catch (Exception e) { log.debug(StorageTypeEnum.ALIYUN.getDescription() + "初始化异常, 已跳过"); @@ -89,47 +58,16 @@ public class AliyunServiceImpl implements FileService { @Override @Cacheable - public List fileList(String path) { - path = StringUtils.removeFirstSeparator(path); - - List fileItemList = new ArrayList<>(); - ObjectListing objectListing = - ossClient.listObjects(new ListObjectsRequest(bucketName).withDelimiter("/").withPrefix(path)); - - for (OSSObjectSummary s : objectListing.getObjectSummaries()) { - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(s.getKey().substring(path.length())); - fileItemDTO.setSize(s.getSize()); - fileItemDTO.setTime(s.getLastModified()); - fileItemDTO.setType(FileTypeEnum.FILE); - fileItemDTO.setPath(path); - fileItemDTO.setUrl(getDownloadUrl(StringUtils.concatUrl(path, fileItemDTO.getName()))); - fileItemList.add(fileItemDTO); - } - - for (String commonPrefix : objectListing.getCommonPrefixes()) { - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(commonPrefix.substring(path.length(), commonPrefix.length() - 1)); - fileItemDTO.setType(FileTypeEnum.FOLDER); - fileItemDTO.setPath(path); - fileItemList.add(fileItemDTO); - } - - return fileItemList; + public List fileList(String path) throws Exception { + s3Model.setPath(path); + return s3FileList(s3Client, s3Model); } @Override @Cacheable public String getDownloadUrl(String path) { - path = StringUtils.removeFirstSeparator(path); - - if (isPrivate) { - Date expirationDate = new Date(System.currentTimeMillis() + timeout * 1000); - URL url = ossClient.generatePresignedUrl(bucketName, path, expirationDate); - return URLUtil.complateUrl(domain, url.getFile()); - } else { - return URLUtil.complateUrl(domain, path); - } + s3Model.setPath(path); + return s3ObjectUrl(s3Client, s3Model); } @Override @@ -137,8 +75,4 @@ public class AliyunServiceImpl implements FileService { return StorageTypeEnum.ALIYUN; } - @Override - public boolean getIsInitialized() { - return isInitialized; - } } diff --git a/src/main/java/im/zhaojun/common/service/AbstractFileService.java b/src/main/java/im/zhaojun/common/service/AbstractFileService.java new file mode 100644 index 0000000..3d3a6ac --- /dev/null +++ b/src/main/java/im/zhaojun/common/service/AbstractFileService.java @@ -0,0 +1,108 @@ +package im.zhaojun.common.service; + +import im.zhaojun.common.config.ZFileCacheConfiguration; +import im.zhaojun.common.model.dto.FileItemDTO; +import im.zhaojun.common.model.enums.FileTypeEnum; +import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.util.StringUtils; +import org.springframework.aop.framework.AopContext; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; + +import javax.annotation.PostConstruct; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhaojun + * @date 2019/12/28 19:27 + */ +@CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") +public abstract class AbstractFileService implements FileService { + + protected boolean isInitialized; + + /** + * 初始化方法, 启动时自动调用实现类的此方法进行初始化. + */ + @PostConstruct + public abstract void init(); + + + protected boolean testConnection() { + boolean flag = true; + try { + fileList("/"); + } catch (Exception e) { + e.printStackTrace(); + flag = false; + } + return flag; + } + + /** + * 获取是否初始化成功 + * @return 初始化成功与否 + */ + public boolean getIsInitialized() { + return isInitialized; + } + + /** + * 获取存储引擎类型 + * @return 存储引擎类型枚举 + */ + public abstract StorageTypeEnum getStorageTypeEnum(); + + /** + * 清除缓存. + */ + @CacheEvict(allEntries = true) + public void clearCache() {} + + /** + * 搜索文件 + * @param name 文件名 + * @return 包含该文件名的所有文件或文件夹 + * @throws Exception 搜索过程出现的异常 + */ + public List search(String name) throws Exception { + List result = new ArrayList<>(); + + List fileItemList = selectAllFileList(); + for (FileItemDTO fileItemDTO : fileItemList) { + if (fileItemDTO.getName().contains(name)) { + result.add(fileItemDTO); + } + } + + return result; + } + + /** + * 查询所有文件 + * @return 所有文件 + * @throws Exception 异常现象 + */ + public List selectAllFileList() throws Exception { + List result = new ArrayList<>(); + + String path = "/"; + + FileService currentFileService = (FileService) AopContext.currentProxy(); + List fileItemList = currentFileService.fileList(path); + ArrayDeque queue = new ArrayDeque<>(fileItemList); + + while (!queue.isEmpty()) { + FileItemDTO fileItemDTO = queue.pop(); + result.add(fileItemDTO); + if (fileItemDTO.getType() == FileTypeEnum.FOLDER) { + String filePath = StringUtils.removeDuplicateSeparator("/" + fileItemDTO.getPath() + "/" + fileItemDTO.getName() + "/"); + queue.addAll(currentFileService.fileList(filePath)); + } + } + + return result; + } +} diff --git a/src/main/java/im/zhaojun/common/service/AbstractS3FileService.java b/src/main/java/im/zhaojun/common/service/AbstractS3FileService.java new file mode 100644 index 0000000..b85cd3f --- /dev/null +++ b/src/main/java/im/zhaojun/common/service/AbstractS3FileService.java @@ -0,0 +1,97 @@ +package im.zhaojun.common.service; + +import cn.hutool.core.util.URLUtil; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.ListObjectsRequest; +import com.amazonaws.services.s3.model.ObjectListing; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import im.zhaojun.common.model.S3Model; +import im.zhaojun.common.model.dto.FileItemDTO; +import im.zhaojun.common.model.enums.FileTypeEnum; +import im.zhaojun.common.util.StringUtils; +import org.springframework.beans.factory.annotation.Value; + +import javax.annotation.Resource; +import java.net.URL; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author zhaojun + * @date 2019/12/26 22:26 + */ +public abstract class AbstractS3FileService extends AbstractFileService { + + @Value("${zfile.cache.timeout}") + private Long timeout; + + @Resource + protected StorageConfigService storageConfigService; + + protected String basePath; + + protected AmazonS3 s3Client; + + protected S3Model s3Model; + + /** + * 获取 S3 指定目录下的对象列表 + * @param s3Client S3 客户端连接 + * @param s3Model S3 对象 + * @return 指定目录下的对象列表 + * @throws Exception 获取过程中出现的异常 + */ + public List s3FileList(AmazonS3 s3Client, S3Model s3Model) throws Exception { + String path = StringUtils.removeFirstSeparator(s3Model.getPath()); + String fullPath = StringUtils.removeFirstSeparator(s3Model.getFullPath()); + String bucketName = s3Model.getBucketName(); + List fileItemList = new ArrayList<>(); + ObjectListing objectListing = s3Client.listObjects(new ListObjectsRequest(bucketName, fullPath, "", "/", 1000)); + + for (S3ObjectSummary s : objectListing.getObjectSummaries()) { + FileItemDTO fileItemDTO = new FileItemDTO(); + if (s.getKey().equals(fullPath)) { + continue; + } + fileItemDTO.setName(s.getKey().substring(fullPath.length())); + fileItemDTO.setSize(s.getSize()); + fileItemDTO.setTime(s.getLastModified()); + fileItemDTO.setType(FileTypeEnum.FILE); + fileItemDTO.setPath(path); + fileItemDTO.setUrl(getDownloadUrl(StringUtils.concatUrl(path, fileItemDTO.getName()))); + fileItemList.add(fileItemDTO); + } + + for (String commonPrefix : objectListing.getCommonPrefixes()) { + FileItemDTO fileItemDTO = new FileItemDTO(); + fileItemDTO.setName(commonPrefix.substring(fullPath.length(), commonPrefix.length() - 1)); + fileItemDTO.setType(FileTypeEnum.FOLDER); + fileItemDTO.setPath(path); + fileItemList.add(fileItemDTO); + } + + return fileItemList; + } + + /** + * 获取对象的访问链接, 如果指定了域名, 则替换为自定义域名. + * @param s3Client S3 客户端连接 + * @param s3Model S3 对象 + * @return S3 对象访问地址 + */ + public String s3ObjectUrl(AmazonS3 s3Client, S3Model s3Model) { + String fullPath = StringUtils.removeFirstSeparator(s3Model.getFullPath()); + String bucketName = s3Model.getBucketName(); + String domain = s3Model.getDomain(); + + Date expirationDate = new Date(System.currentTimeMillis() + timeout * 1000); + URL url = s3Client.generatePresignedUrl(bucketName, fullPath, expirationDate); + + String defaultUrl = url.toExternalForm(); + if (StringUtils.isNotNullOrEmpty(domain)) { + defaultUrl = URLUtil.complateUrl(domain, url.getFile()); + } + return defaultUrl; + } +} diff --git a/src/main/java/im/zhaojun/common/service/FileService.java b/src/main/java/im/zhaojun/common/service/FileService.java index e1b6c06..8a18861 100644 --- a/src/main/java/im/zhaojun/common/service/FileService.java +++ b/src/main/java/im/zhaojun/common/service/FileService.java @@ -1,23 +1,12 @@ package im.zhaojun.common.service; -import im.zhaojun.common.config.ZFileCacheConfiguration; import im.zhaojun.common.model.dto.FileItemDTO; -import im.zhaojun.common.model.enums.FileTypeEnum; -import im.zhaojun.common.model.enums.StorageTypeEnum; -import im.zhaojun.common.util.StringUtils; -import org.springframework.aop.framework.AopContext; -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.CacheEvict; -import javax.annotation.PostConstruct; -import java.util.ArrayDeque; -import java.util.ArrayList; import java.util.List; /** * @author zhaojun */ -@CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") public interface FileService { /** @@ -36,82 +25,4 @@ public interface FileService { */ String getDownloadUrl(String path) throws Exception; - /** - * 初始化方法, 启动时自动调用实现类的此方法进行初始化. - */ - @PostConstruct - default void init() {} - - /** - * 清除缓存. - */ - @CacheEvict(allEntries = true) - default void clearCache() {} - - /** - * 搜索文件 - * @param name 文件名 - * @return 包含该文件名的所有文件或文件夹 - * @throws Exception 搜索过程出现的异常 - */ - default List search(String name) throws Exception { - List result = new ArrayList<>(); - - List fileItemList = selectAllFileList(); - for (FileItemDTO fileItemDTO : fileItemList) { - if (fileItemDTO.getName().contains(name)) { - result.add(fileItemDTO); - } - } - - return result; - } - - /** - * 查询所有文件 - * @return 所有文件 - * @throws Exception 异常现象 - */ - default List selectAllFileList() throws Exception { - List result = new ArrayList<>(); - - String path = "/"; - - FileService currentFileService = (FileService) AopContext.currentProxy(); - List fileItemList = currentFileService.fileList(path); - ArrayDeque queue = new ArrayDeque<>(fileItemList); - - while (!queue.isEmpty()) { - FileItemDTO fileItemDTO = queue.pop(); - result.add(fileItemDTO); - if (fileItemDTO.getType() == FileTypeEnum.FOLDER) { - String filePath = StringUtils.removeDuplicateSeparator("/" + fileItemDTO.getPath() + "/" + fileItemDTO.getName() + "/"); - queue.addAll(currentFileService.fileList(filePath)); - } - } - - return result; - } - - /** - * 获取存储引擎类型 - * @return 存储引擎类型枚举 - */ - StorageTypeEnum getStorageTypeEnum(); - - /** - * 获取是否初始化成功 - * @return 初始化成功与否 - */ - boolean getIsInitialized(); - - default boolean testConnection() { - boolean flag = true; - try { - fileList("/"); - } catch (Exception e) { - flag = false; - } - return flag; - } } diff --git a/src/main/java/im/zhaojun/ftp/service/FtpServiceImpl.java b/src/main/java/im/zhaojun/ftp/service/FtpServiceImpl.java index a389070..85ce914 100644 --- a/src/main/java/im/zhaojun/ftp/service/FtpServiceImpl.java +++ b/src/main/java/im/zhaojun/ftp/service/FtpServiceImpl.java @@ -4,9 +4,11 @@ import cn.hutool.core.util.URLUtil; import cn.hutool.extra.ftp.Ftp; import im.zhaojun.common.config.ZFileCacheConfiguration; import im.zhaojun.common.model.StorageConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.service.AbstractFileService; import im.zhaojun.common.service.FileService; import im.zhaojun.common.service.StorageConfigService; import im.zhaojun.common.util.StringUtils; @@ -27,39 +29,27 @@ import java.util.Map; */ @Service @CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") -public class FtpServiceImpl implements FileService { +public class FtpServiceImpl extends AbstractFileService implements FileService { private static final Logger log = LoggerFactory.getLogger(FtpServiceImpl.class); @Resource private StorageConfigService storageConfigService; - private static final String HOST_KEY = "host"; - - private static final String PORT_KEY = "port"; - - private static final String USERNAME_KEY = "username"; - - private static final String PASSWORD_KEY = "password"; - - private static final String DOMAIN_KEY = "domain"; - private Ftp ftp; private String domain; - private boolean isInitialized; - @Override public void init() { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.FTP); - String host = stringStorageConfigMap.get(HOST_KEY).getValue(); - String port = stringStorageConfigMap.get(PORT_KEY).getValue(); - String username = stringStorageConfigMap.get(USERNAME_KEY).getValue(); - String password = stringStorageConfigMap.get(PASSWORD_KEY).getValue(); - domain = stringStorageConfigMap.get(DOMAIN_KEY).getValue(); + String host = stringStorageConfigMap.get(StorageConfigConstant.HOST_KEY).getValue(); + String port = stringStorageConfigMap.get(StorageConfigConstant.PORT_KEY).getValue(); + String username = stringStorageConfigMap.get(StorageConfigConstant.USERNAME_KEY).getValue(); + String password = stringStorageConfigMap.get(StorageConfigConstant.PASSWORD_KEY).getValue(); + domain = stringStorageConfigMap.get(StorageConfigConstant.DOMAIN_KEY).getValue(); ftp = new Ftp(host, Integer.parseInt(port), username, password); isInitialized = testConnection(); @@ -100,10 +90,4 @@ public class FtpServiceImpl implements FileService { public StorageTypeEnum getStorageTypeEnum() { return StorageTypeEnum.FTP; } - - - @Override - public boolean getIsInitialized() { - return isInitialized; - } } diff --git a/src/main/java/im/zhaojun/huawei/service/HuaweiServiceImpl.java b/src/main/java/im/zhaojun/huawei/service/HuaweiServiceImpl.java index 616c2d5..b0b4e12 100644 --- a/src/main/java/im/zhaojun/huawei/service/HuaweiServiceImpl.java +++ b/src/main/java/im/zhaojun/huawei/service/HuaweiServiceImpl.java @@ -1,32 +1,23 @@ package im.zhaojun.huawei.service; -import cn.hutool.core.util.URLUtil; -import com.obs.services.ObsClient; -import com.obs.services.model.HttpMethodEnum; -import com.obs.services.model.ListObjectsRequest; -import com.obs.services.model.ObjectListing; -import com.obs.services.model.ObjectMetadata; -import com.obs.services.model.ObsObject; -import com.obs.services.model.TemporarySignatureRequest; -import com.obs.services.model.TemporarySignatureResponse; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import im.zhaojun.common.config.ZFileCacheConfiguration; +import im.zhaojun.common.model.S3Model; import im.zhaojun.common.model.StorageConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; -import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.service.AbstractS3FileService; import im.zhaojun.common.service.FileService; -import im.zhaojun.common.service.StorageConfigService; -import im.zhaojun.common.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.net.URL; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -35,46 +26,30 @@ import java.util.Map; */ @Service @CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") -public class HuaweiServiceImpl implements FileService { +public class HuaweiServiceImpl extends AbstractS3FileService implements FileService { private static final Logger log = LoggerFactory.getLogger(HuaweiServiceImpl.class); - private String bucketName; - - private String domain; - - @Value("${zfile.cache.timeout}") - private Long timeout; - - private static final String BUCKET_NAME_KEY = "bucket-name"; - - private static final String ACCESS_KEY = "accessKey"; - - private static final String SECRET_KEY = "secretKey"; - - private static final String DOMAIN_KEY = "domain"; - - private static final String ENDPOINT_KEY = "endPoint"; - - @Resource - private StorageConfigService storageConfigService; - - private ObsClient obsClient; - - private boolean isInitialized; - @Override public void init() { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.HUAWEI); - String accessKey = stringStorageConfigMap.get(ACCESS_KEY).getValue(); - String secretKey = stringStorageConfigMap.get(SECRET_KEY).getValue(); - String endPoint = stringStorageConfigMap.get(ENDPOINT_KEY).getValue(); + String accessKey = stringStorageConfigMap.get(StorageConfigConstant.ACCESS_KEY).getValue(); + String secretKey = stringStorageConfigMap.get(StorageConfigConstant.SECRET_KEY).getValue(); + String endPoint = stringStorageConfigMap.get(StorageConfigConstant.ENDPOINT_KEY).getValue(); + + String bucketName = stringStorageConfigMap.get(StorageConfigConstant.BUCKET_NAME_KEY).getValue(); + String domain = stringStorageConfigMap.get(StorageConfigConstant.DOMAIN_KEY).getValue(); + String basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); + + BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, "obs")).build(); + + s3Model = S3Model.builder().bucketName(bucketName).basePath(basePath).domain(domain).build(); - bucketName = stringStorageConfigMap.get(BUCKET_NAME_KEY).getValue(); - domain = stringStorageConfigMap.get(DOMAIN_KEY).getValue(); - obsClient = new ObsClient(accessKey, secretKey, endPoint); isInitialized = testConnection(); } catch (Exception e) { log.debug(StorageTypeEnum.HUAWEI.getDescription() + "初始化异常, 已跳过"); @@ -84,52 +59,15 @@ public class HuaweiServiceImpl implements FileService { @Override @Cacheable public List fileList(String path) throws Exception { - path = StringUtils.removeFirstSeparator(path); - - List fileItemList = new ArrayList<>(); - - ListObjectsRequest listObjectsRequest = new ListObjectsRequest(); - listObjectsRequest.setBucketName(bucketName); - listObjectsRequest.setDelimiter("/"); - listObjectsRequest.setPrefix(path); - ObjectListing objectListing = obsClient.listObjects(listObjectsRequest); - List objects = objectListing.getObjects(); - - for (ObsObject object : objects) { - String fileName = object.getObjectKey(); - ObjectMetadata metadata = object.getMetadata(); - - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(fileName.substring(path.length())); - fileItemDTO.setSize(metadata.getContentLength()); - fileItemDTO.setTime(metadata.getLastModified()); - fileItemDTO.setType(FileTypeEnum.FILE); - fileItemDTO.setPath(path); - fileItemDTO.setUrl(getDownloadUrl(StringUtils.concatUrl(path, fileItemDTO.getName()))); - fileItemList.add(fileItemDTO); - } - - for (String commonPrefix : objectListing.getCommonPrefixes()) { - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(commonPrefix.substring(0, commonPrefix.length() - 1)); - fileItemDTO.setType(FileTypeEnum.FOLDER); - fileItemDTO.setPath(path); - fileItemList.add(fileItemDTO); - } - - return fileItemList; + s3Model.setPath(path); + return s3FileList(s3Client, s3Model); } @Override @Cacheable - public String getDownloadUrl(String path) throws Exception { - String clearPath = StringUtils.removeFirstSeparator(path); - TemporarySignatureRequest req = new TemporarySignatureRequest(HttpMethodEnum.GET, timeout); - req.setBucketName(bucketName); - req.setObjectKey(clearPath); - TemporarySignatureResponse res = obsClient.createTemporarySignature(req); - URL url = new URL(res.getSignedUrl()); - return URLUtil.complateUrl(domain, url.getFile()); + public String getDownloadUrl(String path) { + s3Model.setPath(path); + return s3ObjectUrl(s3Client, s3Model); } @Override @@ -137,11 +75,4 @@ public class HuaweiServiceImpl implements FileService { return StorageTypeEnum.HUAWEI; } - - @Override - public boolean getIsInitialized() { - return isInitialized; - } - - } \ No newline at end of file diff --git a/src/main/java/im/zhaojun/local/service/LocalServiceImpl.java b/src/main/java/im/zhaojun/local/service/LocalServiceImpl.java index a4fb2bd..bb6866c 100644 --- a/src/main/java/im/zhaojun/local/service/LocalServiceImpl.java +++ b/src/main/java/im/zhaojun/local/service/LocalServiceImpl.java @@ -2,11 +2,13 @@ package im.zhaojun.local.service; import im.zhaojun.common.model.StorageConfig; import im.zhaojun.common.model.SystemConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.constant.SystemConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; import im.zhaojun.common.repository.SystemConfigRepository; +import im.zhaojun.common.service.AbstractFileService; import im.zhaojun.common.service.FileService; import im.zhaojun.common.service.StorageConfigService; import im.zhaojun.common.util.StringUtils; @@ -25,12 +27,10 @@ import java.util.Map; * @author zhaojun */ @Service -public class LocalServiceImpl implements FileService { +public class LocalServiceImpl extends AbstractFileService implements FileService { private static final Logger log = LoggerFactory.getLogger(LocalServiceImpl.class); - private static final String FILE_PATH_KEY = "filePath"; - @Resource private StorageConfigService storageConfigService; @@ -39,14 +39,12 @@ public class LocalServiceImpl implements FileService { private String filePath; - private boolean isInitialized; - @Override public void init() { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.LOCAL); - filePath = stringStorageConfigMap.get(FILE_PATH_KEY).getValue(); + filePath = stringStorageConfigMap.get(StorageConfigConstant.FILE_PATH_KEY).getValue(); isInitialized = testConnection(); } catch (Exception e) { log.debug(StorageTypeEnum.LOCAL.getDescription() + "初始化异常, 已跳过"); @@ -100,10 +98,4 @@ public class LocalServiceImpl implements FileService { return StorageTypeEnum.LOCAL; } - - @Override - public boolean getIsInitialized() { - return isInitialized; - } - } \ No newline at end of file diff --git a/src/main/java/im/zhaojun/minio/MinIOServiceImpl.java b/src/main/java/im/zhaojun/minio/MinIOServiceImpl.java index ce796be..03e7c43 100644 --- a/src/main/java/im/zhaojun/minio/MinIOServiceImpl.java +++ b/src/main/java/im/zhaojun/minio/MinIOServiceImpl.java @@ -1,25 +1,23 @@ package im.zhaojun.minio; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import im.zhaojun.common.config.ZFileCacheConfiguration; +import im.zhaojun.common.model.S3Model; import im.zhaojun.common.model.StorageConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; -import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.service.AbstractS3FileService; import im.zhaojun.common.service.FileService; -import im.zhaojun.common.service.StorageConfigService; -import im.zhaojun.common.util.StringUtils; -import io.minio.MinioClient; -import io.minio.Result; -import io.minio.messages.Item; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -28,87 +26,46 @@ import java.util.Map; */ @Service @CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") -public class MinIOServiceImpl implements FileService { +public class MinIOServiceImpl extends AbstractS3FileService implements FileService { private static final Logger log = LoggerFactory.getLogger(MinIOServiceImpl.class); - private String bucketName; - - @Value("${zfile.cache.timeout}") - private Long timeout; - - private static final String BUCKET_NAME_KEY = "bucket-name"; - - private static final String ACCESS_KEY = "accessKey"; - - private static final String SECRET_KEY = "secretKey"; - - private static final String ENDPOINT_KEY = "endPoint"; - - private static final String BASE_PATH = "base-path"; - - @Resource - private StorageConfigService storageConfigService; - - private MinioClient minioClient; - - private boolean isInitialized; - - private String basePath; - @Override public void init() { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.MINIO); - String accessKey = stringStorageConfigMap.get(ACCESS_KEY).getValue(); - String secretKey = stringStorageConfigMap.get(SECRET_KEY).getValue(); - String endPoint = stringStorageConfigMap.get(ENDPOINT_KEY).getValue(); - bucketName = stringStorageConfigMap.get(BUCKET_NAME_KEY).getValue(); - minioClient = new MinioClient(endPoint, accessKey, secretKey); - basePath = stringStorageConfigMap.get(BASE_PATH).getValue(); - basePath = basePath == null ? "" : basePath; + String accessKey = stringStorageConfigMap.get(StorageConfigConstant.ACCESS_KEY).getValue(); + String secretKey = stringStorageConfigMap.get(StorageConfigConstant.SECRET_KEY).getValue(); + String endPoint = stringStorageConfigMap.get(StorageConfigConstant.ENDPOINT_KEY).getValue(); + String bucketName = stringStorageConfigMap.get(StorageConfigConstant.BUCKET_NAME_KEY).getValue(); + String basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); + + BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, "minio")).build(); + + s3Model = S3Model.builder().bucketName(bucketName).basePath(basePath).build(); + isInitialized = testConnection(); } catch (Exception e) { log.debug(StorageTypeEnum.MINIO.getDescription() + "初始化异常, 已跳过"); } } - // @Cacheable @Override + @Cacheable public List fileList(String path) throws Exception { - path = StringUtils.removeFirstSeparator(path); - String fullPath = StringUtils.removeFirstSeparator(StringUtils.removeDuplicateSeparator(basePath + "/" + path + "/")); - List fileItemList = new ArrayList<>(); - - Iterable> iterable = minioClient.listObjects(bucketName, fullPath, false); - - for (Result itemResult : iterable) { - Item item = itemResult.get(); - - FileItemDTO fileItemDTO = new FileItemDTO(); - if (item.isDir()) { - fileItemDTO.setName(StringUtils.removeLastSeparator(item.objectName().replace(fullPath, ""))); - fileItemDTO.setType(FileTypeEnum.FOLDER); - fileItemDTO.setPath(path); - } else { - fileItemDTO.setName(item.objectName().replace(fullPath, "")); - fileItemDTO.setSize(item.objectSize()); - fileItemDTO.setTime(item.lastModified()); - fileItemDTO.setType(FileTypeEnum.FILE); - fileItemDTO.setPath(path); - fileItemDTO.setUrl(getDownloadUrl(StringUtils.concatUrl(fullPath, fileItemDTO.getName()))); - } - fileItemList.add(fileItemDTO); - } - - return fileItemList; + s3Model.setPath(path); + return s3FileList(s3Client, s3Model); } - @Cacheable @Override - public String getDownloadUrl(String path) throws Exception { - return minioClient.presignedGetObject(bucketName, path, timeout.intValue()); + @Cacheable + public String getDownloadUrl(String path) { + s3Model.setPath(path); + return s3ObjectUrl(s3Client, s3Model); } @Override @@ -116,8 +73,4 @@ public class MinIOServiceImpl implements FileService { return StorageTypeEnum.MINIO; } - @Override - public boolean getIsInitialized() { - return isInitialized; - } } diff --git a/src/main/java/im/zhaojun/qiniu/service/QiniuServiceImpl.java b/src/main/java/im/zhaojun/qiniu/service/QiniuServiceImpl.java index ddc2643..ab32e65 100644 --- a/src/main/java/im/zhaojun/qiniu/service/QiniuServiceImpl.java +++ b/src/main/java/im/zhaojun/qiniu/service/QiniuServiceImpl.java @@ -1,20 +1,17 @@ package im.zhaojun.qiniu.service; -import cn.hutool.core.util.URLUtil; -import com.qiniu.common.Zone; -import com.qiniu.storage.BucketManager; -import com.qiniu.storage.Configuration; -import com.qiniu.storage.model.FileInfo; -import com.qiniu.storage.model.FileListing; -import com.qiniu.util.Auth; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import im.zhaojun.common.config.ZFileCacheConfiguration; +import im.zhaojun.common.model.S3Model; import im.zhaojun.common.model.StorageConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; -import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.service.AbstractS3FileService; import im.zhaojun.common.service.FileService; -import im.zhaojun.common.service.StorageConfigService; -import im.zhaojun.common.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -22,9 +19,6 @@ import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map; @@ -33,51 +27,32 @@ import java.util.Map; */ @Service @CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") -public class QiniuServiceImpl implements FileService { +public class QiniuServiceImpl extends AbstractS3FileService implements FileService { private static final Logger log = LoggerFactory.getLogger(QiniuServiceImpl.class); @Value("${zfile.cache.timeout}") private Long timeout; - @Resource - private StorageConfigService storageConfigService; - - private static final String BUCKET_NAME_KEY = "bucket-name"; - - private static final String ACCESS_KEY = "accessKey"; - - private static final String SECRET_KEY = "secretKey"; - - private static final String DOMAIN_KEY = "domain"; - - private BucketManager bucketManager; - - private Auth auth; - - private String bucketName; - - private String domain; - - private boolean isPrivate; - - private boolean isInitialized; - @Override public void init() { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.QINIU); - String accessKey = stringStorageConfigMap.get(ACCESS_KEY).getValue(); - String secretKey = stringStorageConfigMap.get(SECRET_KEY).getValue(); + String accessKey = stringStorageConfigMap.get(StorageConfigConstant.ACCESS_KEY).getValue(); + String secretKey = stringStorageConfigMap.get(StorageConfigConstant.SECRET_KEY).getValue(); + String endPoint = stringStorageConfigMap.get(StorageConfigConstant.ENDPOINT_KEY).getValue(); + String bucketName = stringStorageConfigMap.get(StorageConfigConstant.BUCKET_NAME_KEY).getValue(); + String domain = stringStorageConfigMap.get(StorageConfigConstant.DOMAIN_KEY).getValue(); + String basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); - Configuration cfg = new Configuration(Zone.autoZone()); - auth = Auth.create(accessKey, secretKey); - bucketManager = new BucketManager(auth, cfg); - bucketName = stringStorageConfigMap.get(BUCKET_NAME_KEY).getValue(); - domain = stringStorageConfigMap.get(DOMAIN_KEY).getValue(); + BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, "kodo")).build(); + + s3Model = S3Model.builder().bucketName(bucketName).basePath(basePath).domain(domain).build(); - isPrivate = bucketManager.getBucketInfo(bucketName).getPrivate() == 1; isInitialized = testConnection(); } catch (Exception e) { log.debug(StorageTypeEnum.QINIU.getDescription() + "初始化异常, 已跳过"); @@ -87,53 +62,15 @@ public class QiniuServiceImpl implements FileService { @Override @Cacheable public List fileList(String path) throws Exception { - path = StringUtils.removeFirstSeparator(path); - List fileItemList = new ArrayList<>(); - - // 每次迭代的长度限制, 最大1000, 推荐值 1000 - int limit = 1000; - // 指定目录分隔符, 列出所有公共前缀(模拟列出目录效果). 缺省值为空字符串 - String delimiter = "/"; - // 列举空间文件列表 - FileListing fileListing = bucketManager.listFilesV2(bucketName, path, "", limit, delimiter); - for (FileInfo item : fileListing.items) { - String fileKey = item.key; - String fileName = fileKey.substring(path.length()); - - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(fileName); - fileItemDTO.setSize(item.fsize); - fileItemDTO.setTime(new Date(item.putTime / 1000)); - fileItemDTO.setType(FileTypeEnum.FILE); - fileItemDTO.setPath(path); - fileItemDTO.setUrl(getDownloadUrl(StringUtils.concatUrl(path, fileItemDTO.getName()))); - fileItemList.add(fileItemDTO); - } - - String[] commonPrefixes = fileListing.commonPrefixes; - - for (String commonPrefix : commonPrefixes) { - if ("/".equals(commonPrefix)) { - continue; - } - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(commonPrefix.substring(0, commonPrefix.length() - 1)); - fileItemDTO.setType(FileTypeEnum.FOLDER); - fileItemDTO.setPath(path); - fileItemList.add(fileItemDTO); - } - - return fileItemList; + s3Model.setPath(path); + return s3FileList(s3Client, s3Model); } @Override @Cacheable public String getDownloadUrl(String path) { - String url = URLUtil.complateUrl(domain, path); - if (isPrivate) { - url = auth.privateDownloadUrl(url, timeout); - } - return url; + s3Model.setPath(path); + return s3ObjectUrl(s3Client, s3Model); } @Override @@ -141,10 +78,4 @@ public class QiniuServiceImpl implements FileService { return StorageTypeEnum.QINIU; } - @Override - public boolean getIsInitialized() { - return isInitialized; - } - - } \ No newline at end of file diff --git a/src/main/java/im/zhaojun/tencent/TencentServiceImpl.java b/src/main/java/im/zhaojun/tencent/TencentServiceImpl.java index 81bb10f..eb6295d 100644 --- a/src/main/java/im/zhaojun/tencent/TencentServiceImpl.java +++ b/src/main/java/im/zhaojun/tencent/TencentServiceImpl.java @@ -1,33 +1,23 @@ package im.zhaojun.tencent; -import cn.hutool.core.util.URLUtil; -import com.qcloud.cos.COSClient; -import com.qcloud.cos.ClientConfig; -import com.qcloud.cos.auth.BasicCOSCredentials; -import com.qcloud.cos.auth.COSCredentials; -import com.qcloud.cos.model.COSObjectSummary; -import com.qcloud.cos.model.ListObjectsRequest; -import com.qcloud.cos.model.ObjectListing; -import com.qcloud.cos.region.Region; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import im.zhaojun.common.config.ZFileCacheConfiguration; +import im.zhaojun.common.model.S3Model; import im.zhaojun.common.model.StorageConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; -import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.service.AbstractS3FileService; import im.zhaojun.common.service.FileService; -import im.zhaojun.common.service.StorageConfigService; -import im.zhaojun.common.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map; @@ -36,90 +26,47 @@ import java.util.Map; */ @Service @CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") -public class TencentServiceImpl implements FileService { +public class TencentServiceImpl extends AbstractS3FileService implements FileService { private static final Logger log = LoggerFactory.getLogger(TencentServiceImpl.class); - @Resource - private StorageConfigService storageConfigService; - - private static final String BUCKET_NAME_KEY = "bucket-name"; - - private static final String SECRET_ID_KEY = "secretId"; - - private static final String SECRET_KEY = "secretKey"; - - private static final String DOMAIN_KEY = "domain"; - - private static final String ENDPOINT_KEY = "endPoint"; - - @Value("${zfile.cache.timeout}") - private Long timeout; - - private String bucketName; - - private String domain; - - private COSClient cosClient; - - private boolean isInitialized; - @Override public void init() { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.TENCENT); - String secretId = stringStorageConfigMap.get(SECRET_ID_KEY).getValue(); - String secretKey = stringStorageConfigMap.get(SECRET_KEY).getValue(); - String regionName = stringStorageConfigMap.get(ENDPOINT_KEY).getValue(); - bucketName = stringStorageConfigMap.get(BUCKET_NAME_KEY).getValue(); - domain = stringStorageConfigMap.get(DOMAIN_KEY).getValue(); + String secretId = stringStorageConfigMap.get(StorageConfigConstant.SECRET_ID_KEY).getValue(); + String secretKey = stringStorageConfigMap.get(StorageConfigConstant.SECRET_KEY).getValue(); + String regionName = stringStorageConfigMap.get(StorageConfigConstant.ENDPOINT_KEY).getValue(); + String bucketName = stringStorageConfigMap.get(StorageConfigConstant.BUCKET_NAME_KEY).getValue(); + String domain = stringStorageConfigMap.get(StorageConfigConstant.DOMAIN_KEY).getValue(); + basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); + + BasicAWSCredentials credentials = new BasicAWSCredentials(secretId, secretKey); + s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(regionName, "cos")).build(); + + s3Model = S3Model.builder().bucketName(bucketName).domain(domain).build(); - COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); - Region region = new Region(regionName); - ClientConfig clientConfig = new ClientConfig(region); - cosClient = new COSClient(cred, clientConfig); isInitialized = testConnection(); } catch (Exception e) { log.debug(StorageTypeEnum.TENCENT.getDescription() + "初始化异常, 已跳过"); } } - @Cacheable @Override - public List fileList(String path) { - path = StringUtils.removeFirstSeparator(path); - - List fileItemList = new ArrayList<>(); - ObjectListing objectListing = cosClient.listObjects(new ListObjectsRequest().withBucketName(bucketName).withDelimiter("/").withPrefix(path)); - for (COSObjectSummary s : objectListing.getObjectSummaries()) { - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(s.getKey().substring(path.length())); - fileItemDTO.setSize(s.getSize()); - fileItemDTO.setTime(s.getLastModified()); - fileItemDTO.setType(FileTypeEnum.FILE); - fileItemDTO.setPath(path); - fileItemDTO.setUrl(getDownloadUrl(StringUtils.concatUrl(path, fileItemDTO.getName()))); - fileItemList.add(fileItemDTO); - } - - for (String commonPrefix : objectListing.getCommonPrefixes()) { - FileItemDTO fileItemDTO = new FileItemDTO(); - fileItemDTO.setName(commonPrefix.substring(path.length(), commonPrefix.length() - 1)); - fileItemDTO.setType(FileTypeEnum.FOLDER); - fileItemDTO.setPath(path); - fileItemList.add(fileItemDTO); - } - - return fileItemList; + @Cacheable + public List fileList(String path) throws Exception { + s3Model.setPath(path); + return s3FileList(s3Client, s3Model); } - @Cacheable @Override + @Cacheable public String getDownloadUrl(String path) { - Date expirationDate = new Date(System.currentTimeMillis() + timeout * 1000); - URL url = cosClient.generatePresignedUrl(bucketName, path, expirationDate); - return URLUtil.complateUrl(domain, url.getFile()); + s3Model.setPath(path); + return s3ObjectUrl(s3Client, s3Model); } @Override @@ -127,11 +74,4 @@ public class TencentServiceImpl implements FileService { return StorageTypeEnum.TENCENT; } - - @Override - public boolean getIsInitialized() { - return isInitialized; - } - - } \ No newline at end of file diff --git a/src/main/java/im/zhaojun/upyun/service/UpYunServiceImpl.java b/src/main/java/im/zhaojun/upyun/service/UpYunServiceImpl.java index c6c0d86..a849caf 100644 --- a/src/main/java/im/zhaojun/upyun/service/UpYunServiceImpl.java +++ b/src/main/java/im/zhaojun/upyun/service/UpYunServiceImpl.java @@ -4,9 +4,11 @@ import cn.hutool.core.util.URLUtil; import com.UpYun; import im.zhaojun.common.config.ZFileCacheConfiguration; import im.zhaojun.common.model.StorageConfig; +import im.zhaojun.common.model.constant.StorageConfigConstant; import im.zhaojun.common.model.dto.FileItemDTO; import im.zhaojun.common.model.enums.FileTypeEnum; import im.zhaojun.common.model.enums.StorageTypeEnum; +import im.zhaojun.common.service.AbstractFileService; import im.zhaojun.common.service.FileService; import im.zhaojun.common.service.StorageConfigService; import im.zhaojun.common.util.StringUtils; @@ -27,7 +29,7 @@ import java.util.Map; */ @Service @CacheConfig(cacheNames = ZFileCacheConfiguration.CACHE_NAME, keyGenerator = "keyGenerator") -public class UpYunServiceImpl implements FileService { +public class UpYunServiceImpl extends AbstractFileService implements FileService { private static final Logger log = LoggerFactory.getLogger(UpYunServiceImpl.class); @@ -36,22 +38,10 @@ public class UpYunServiceImpl implements FileService { @Resource private StorageConfigService storageConfigService; - private static final String BUCKET_NAME_KEY = "bucket-name"; - - private static final String USERNAME_KEY = "username"; - - private static final String PASSWORD_KEY = "password"; - - private static final String DOMAIN_KEY = "domain"; - - private static final String BASE_PATH = "base-path"; - private String domain; private UpYun upYun; - private boolean isInitialized; - private String basePath; @Override @@ -59,11 +49,11 @@ public class UpYunServiceImpl implements FileService { try { Map stringStorageConfigMap = storageConfigService.selectStorageConfigMapByKey(StorageTypeEnum.UPYUN); - String bucketName = stringStorageConfigMap.get(BUCKET_NAME_KEY).getValue(); - String username = stringStorageConfigMap.get(USERNAME_KEY).getValue(); - String password = stringStorageConfigMap.get(PASSWORD_KEY).getValue(); - domain = stringStorageConfigMap.get(DOMAIN_KEY).getValue(); - basePath = stringStorageConfigMap.get(BASE_PATH).getValue(); + String bucketName = stringStorageConfigMap.get(StorageConfigConstant.BUCKET_NAME_KEY).getValue(); + String username = stringStorageConfigMap.get(StorageConfigConstant.USERNAME_KEY).getValue(); + String password = stringStorageConfigMap.get(StorageConfigConstant.PASSWORD_KEY).getValue(); + domain = stringStorageConfigMap.get(StorageConfigConstant.DOMAIN_KEY).getValue(); + basePath = stringStorageConfigMap.get(StorageConfigConstant.BASE_PATH).getValue(); upYun = new UpYun(bucketName, username, password); isInitialized = testConnection(); } catch (Exception e) { @@ -71,8 +61,8 @@ public class UpYunServiceImpl implements FileService { } } - @Cacheable @Override + @Cacheable public List fileList(String path) throws Exception { ArrayList fileItemList = new ArrayList<>(); String nextMark = null; @@ -106,8 +96,8 @@ public class UpYunServiceImpl implements FileService { } - @Cacheable @Override + @Cacheable public String getDownloadUrl(String path) { return URLUtil.complateUrl(domain, path); } @@ -117,10 +107,4 @@ public class UpYunServiceImpl implements FileService { return StorageTypeEnum.UPYUN; } - - @Override - public boolean getIsInitialized() { - return isInitialized; - } - } \ No newline at end of file