diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 8b52174..2e8e550 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -14,6 +14,7 @@ + @@ -37,6 +38,7 @@ + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index b29e007..2fd322d 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -4,6 +4,7 @@ + diff --git a/ds-commons/ds-config/ds-oss-config/pom.xml b/ds-commons/ds-config/ds-oss-config/pom.xml new file mode 100644 index 0000000..7e795cd --- /dev/null +++ b/ds-commons/ds-config/ds-oss-config/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.ds + ds-config + 0.0.1-SNAPSHOT + + + com.ds.common.oss + ds-oss-config + + + 17 + 17 + UTF-8 + + + + + org.springframework + spring-context + + + io.minio + minio + + + org.projectlombok + lombok + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework + spring-web + + + org.apache.tomcat.embed + tomcat-embed-core + + + jakarta.validation + jakarta.validation-api + + + + \ No newline at end of file diff --git a/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/bean/MinioConfiguration.java b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/bean/MinioConfiguration.java new file mode 100644 index 0000000..bfdb2a1 --- /dev/null +++ b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/bean/MinioConfiguration.java @@ -0,0 +1,32 @@ +package com.ds.common.oss.bean; + +import io.minio.MinioClient; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author ds + * @since 2023/11/27 + */ + +@Configuration +@EnableConfigurationProperties(OssProperties.class) +@ConditionalOnProperty(value = "oss.name", havingValue = "minio") +public class MinioConfiguration { + + private final OssProperties ossProperties; + + public MinioConfiguration(OssProperties ossProperties){ + this.ossProperties=ossProperties; + } + + @Bean + public MinioClient minioClient() { + return MinioClient.builder() + .endpoint(ossProperties.getEndpoint()) + .credentials(ossProperties.getAccessKey(), ossProperties.getSecretKey()) + .build(); + } +} diff --git a/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/bean/OssProperties.java b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/bean/OssProperties.java new file mode 100644 index 0000000..610b518 --- /dev/null +++ b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/bean/OssProperties.java @@ -0,0 +1,49 @@ +package com.ds.common.oss.bean; + +import lombok.Data; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.util.Assert; + +/** + * @author ds + * @since 2023/11/27 + */ +@Data +@ConfigurationProperties(prefix = OssProperties.PREFIX) +public class OssProperties implements InitializingBean { + + /** + * 配置前缀 + */ + public static final String PREFIX = "oss"; + + /** + * 对象存储名称 + */ + private String name; + + /** + * 对象存储服务的URL + */ + private String endpoint; + + /** + * Access key 账户ID + */ + private String accessKey; + + /** + * Secret key 密码 + */ + private String secretKey; + + + @Override + public void afterPropertiesSet() { + Assert.hasText(endpoint, "Minio endpoint 为空"); + Assert.hasText(accessKey, "Minio accessKey为空"); + Assert.hasText(secretKey, "Minio secretKey为空"); + } + +} diff --git a/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/core/OssTemplate.java b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/core/OssTemplate.java new file mode 100644 index 0000000..6666497 --- /dev/null +++ b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/core/OssTemplate.java @@ -0,0 +1,99 @@ +package com.ds.common.oss.core; + +import com.ds.common.oss.pojo.OssFile; +import io.minio.messages.Bucket; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.util.List; + +/** + * @author ds + * @since 2023/11/27 + */ +public interface OssTemplate { + + /** + * 存储桶是否存在 + * + * @param bucketName 存储桶名称 + * @return boolean + */ + boolean bucketExists(@NotEmpty(message = "桶名称不能为空") String bucketName); + + /** + * 创建桶 + * @param bucketName 存储桶名称 + * @return boolean + */ + boolean makeBucket(String bucketName); + + /** + * 删除桶 + * @param bucketName 存储桶名称 + * @return boolean + */ + boolean removeBucket(String bucketName); + + /** + * 获取全部桶 + * @return 全部桶列表 + */ + List getAllBuckets(); + + String preview(String fileName); + + /** + * 获取文件信息 + * + * @param fileName 存储桶文件名称 + * @return InputStream + */ + OssFile getOssInfo(@NotEmpty(message = "桶名称不能为空") String bucketName,@NotEmpty(message = "文件名称不能为空") String fileName); + + /** + * 上传文件 + * + * @param folderName 上传的文件夹名称 + * @param fileName 上传文件名 + * @param file 上传文件类 + * @return BladeFile + */ + OssFile uploadFile(String folderName, String fileName, MultipartFile file); + + /** + * 上传文件 + * + * @param folderName 上传的文件夹名称 + * @param fileName 存储桶对象名称 + * @param suffix 文件后缀名 + * @param stream 文件流 + * @return BladeFile + */ + OssFile uploadFile(String folderName, String fileName, String suffix, InputStream stream); + + /** + * 删除文件 + * + * @param fileName 存储桶对象名称 + */ + boolean removeFile(String fileName); + + /** + * 批量删除文件 + * + * @param fileNames 存储桶对象名称集合 + */ + boolean removeFiles(List fileNames); + + /** + * 下载文件 + * @param response res + * @param fileName 文件名称 + * @param filePath 文件路径 + */ + void downloadFile(HttpServletResponse response, String fileName, String filePath); + +} diff --git a/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/pojo/OssFile.java b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/pojo/OssFile.java new file mode 100644 index 0000000..f536047 --- /dev/null +++ b/ds-commons/ds-config/ds-oss-config/src/main/java/com/ds/common/oss/pojo/OssFile.java @@ -0,0 +1,46 @@ +package com.ds.common.oss.pojo; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author ds + * @since 2023/11/27 + */ +@Data +public class OssFile implements Serializable { + /** + * 文件地址 + */ + private String filePath; + /** + * 域名地址 + */ + private String domain; + /** + * 文件名 + */ + private String name; + /** + * 原始文件名 + */ + private String originalName; + /** + * 文件hash值 + */ + public String hash; + /** + * 文件大小 + */ + private long size; + /** + * 文件上传时间 + */ + private LocalDateTime putTime; + /** + * 文件contentType + */ + private String contentType; +} diff --git a/ds-commons/ds-config/pom.xml b/ds-commons/ds-config/pom.xml index 0cb20b1..760ba98 100644 --- a/ds-commons/ds-config/pom.xml +++ b/ds-commons/ds-config/pom.xml @@ -15,6 +15,7 @@ ds-web-config ds-mybatisplus-config ds-mybatisplus-support + ds-oss-config diff --git a/pom.xml b/pom.xml index 00a7caf..7d94300 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,11 @@ knife4j-openapi3-spring-boot-starter ${knife4j.version} + + io.minio + minio + 8.5.4 +