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