diff --git a/pom.xml b/pom.xml index 0078aa2..35f6ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,11 @@ spring-boot-starter-test test + + io.minio + minio + 3.0.10 + diff --git a/src/main/java/im/zhaojun/common/util/HttpUtil.java b/src/main/java/im/zhaojun/common/util/HttpUtil.java index a90a78a..a00a630 100644 --- a/src/main/java/im/zhaojun/common/util/HttpUtil.java +++ b/src/main/java/im/zhaojun/common/util/HttpUtil.java @@ -1,12 +1,13 @@ package im.zhaojun.common.util; +import cn.hutool.core.util.URLUtil; import org.springframework.web.client.RestTemplate; public class HttpUtil { public static String getTextContent(String url) { RestTemplate restTemplate = SpringContextHolder.getBean(RestTemplate.class); - String result = restTemplate.getForObject(url, String.class); + String result = restTemplate.getForObject(URLUtil.decode(url), String.class); return result == null ? "" : result; } diff --git a/src/main/java/im/zhaojun/minio/MinIOService.java b/src/main/java/im/zhaojun/minio/MinIOService.java new file mode 100644 index 0000000..590f8f5 --- /dev/null +++ b/src/main/java/im/zhaojun/minio/MinIOService.java @@ -0,0 +1,109 @@ +package im.zhaojun.minio; + +import im.zhaojun.common.model.StorageConfig; +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.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.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +public class MinIOService implements FileService { + + + private static final Logger log = LoggerFactory.getLogger(MinIOService.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"; + + @Resource + private StorageConfigService storageConfigService; + + private MinioClient minioClient; + + private boolean isInitialized; + + @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); + isInitialized = true; + } catch (Exception e) { + log.debug(StorageTypeEnum.HUAWEI.getDescription() + "初始化异常, 已跳过"); + } + } + + + @Override + public List fileList(String path) throws Exception { + path = StringUtils.removeFirstSeparator(path); + List fileItemList = new ArrayList<>(); + + Iterable> iterable = minioClient.listObjects(bucketName, path, false); + + for (Result itemResult : iterable) { + Item item = itemResult.get(); + + FileItemDTO fileItemDTO = new FileItemDTO(); + if (item.isDir()) { + fileItemDTO.setName(StringUtils.removeLastSeparator(item.objectName().replaceFirst(path, ""))); + fileItemDTO.setType(FileTypeEnum.FOLDER); + fileItemDTO.setPath(path); + } else { + fileItemDTO.setName(item.objectName().replaceFirst(path, "")); + fileItemDTO.setSize(item.objectSize()); + fileItemDTO.setTime(item.lastModified()); + fileItemDTO.setType(FileTypeEnum.FILE); + fileItemDTO.setPath(path); + fileItemDTO.setUrl(getDownloadUrl(StringUtils.concatUrl(path, fileItemDTO.getName()))); + } + fileItemList.add(fileItemDTO); + } + + return fileItemList; + } + + @Override + public String getDownloadUrl(String path) throws Exception { + return minioClient.presignedGetObject(bucketName, path, timeout.intValue()); + } + + @Override + public StorageTypeEnum getStorageTypeEnum() { + return StorageTypeEnum.MINIO; + } + + @Override + public boolean getIsInitialized() { + return isInitialized; + } +} diff --git a/src/main/resources/db/data.sql b/src/main/resources/db/data.sql index 3caf1ad..951bc64 100644 --- a/src/main/resources/db/data.sql +++ b/src/main/resources/db/data.sql @@ -36,4 +36,8 @@ INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (25, 'se INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (26, 'secretKey', 'SecretKey', 'tencent', null); INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (27, 'bucket-name', '云存储服务名称', 'tencent', null); INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (28, 'domain', '加速域名', 'tencent', null); -INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (29, 'endPoint', '区域', 'tencent', null); \ No newline at end of file +INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (29, 'endPoint', '区域', 'tencent', null); +INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (30, 'accessKey', 'SecretId', 'minio', null); +INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (31, 'secretKey', 'SecretKey', 'minio', null); +INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (32, 'endPoint', '服务地址', 'minio', null); +INSERT INTO STORAGE_CONFIG (`ID`, `k`, `TITLE`, `TYPE`, `VALUE`) VALUES (33, 'bucket-name', '存储空间名称', 'minio', null); \ No newline at end of file