From f3e072352b7c1404073fbc9aa71eafcd85d4e019 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sun, 28 Sep 2025 18:23:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(storage):=20=E9=9B=86=E6=88=90MinIO?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E5=AD=98=E5=82=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加MinIO配置属性类MinioProperties - 实现MinIO文件上传服务MinioService - 在CommonController中增加MinIO上传逻辑分支 - 支持单文件和多文件的MinIO上传处理 - 保留原有本地文件上传作为备选方案- 添加MinIO Java SDK依赖到框架模块 - 移除重复的Spring Context依赖声明 --- ruoyi-admin/pom.xml | 4 - .../controller/common/CommonController.java | 61 ++++++++++++--- .../src/main/resources/application.yml | 8 ++ ruoyi-framework/pom.xml | 7 ++ .../framework/config/MinioProperties.java | 39 ++++++++++ .../ruoyi/framework/service/MinioService.java | 78 +++++++++++++++++++ ruoyi-video/pom.xml | 10 +++ 7 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MinioProperties.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/service/MinioService.java diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 1450169..0d2c17c 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -62,10 +62,6 @@ org.springframework spring-context - - org.springframework - spring-context - diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index b7fad0c..c17da6c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -20,6 +20,8 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.framework.config.ServerConfig; +import com.ruoyi.framework.config.MinioProperties; +import com.ruoyi.framework.service.MinioService; /** * 通用请求处理 @@ -35,6 +37,12 @@ public class CommonController @Autowired private ServerConfig serverConfig; + @Autowired(required = false) + private MinioService minioService; + + @Autowired(required = false) + private MinioProperties minioProperties; + private static final String FILE_DELIMETER = ","; /** @@ -77,9 +85,22 @@ public class CommonController { try { - // 上传文件路径 + if (minioProperties != null && minioProperties.isEnabled()) + { + MinioService.UploadResult result = minioService.upload(file); + String fileName = result.getObjectName(); + String url = result.getUrl(); + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + ajax.put("originalFilename", file.getOriginalFilename()); + return ajax; + } + + // 本地上传路径 String filePath = RuoYiConfig.getUploadPath(); - // 上传并返回新文件名称 + // 本地上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); @@ -103,21 +124,37 @@ public class CommonController { try { - // 上传文件路径 - String filePath = RuoYiConfig.getUploadPath(); List urls = new ArrayList(); List fileNames = new ArrayList(); List newFileNames = new ArrayList(); List originalFilenames = new ArrayList(); - for (MultipartFile file : files) + if (minioProperties != null && minioProperties.isEnabled()) { - // 上传并返回新文件名称 - String fileName = FileUploadUtils.upload(filePath, file); - String url = serverConfig.getUrl() + fileName; - urls.add(url); - fileNames.add(fileName); - newFileNames.add(FileUtils.getName(fileName)); - originalFilenames.add(file.getOriginalFilename()); + for (MultipartFile file : files) + { + MinioService.UploadResult result = minioService.upload(file); + String fileName = result.getObjectName(); + String url = result.getUrl(); + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + } + else + { + // 本地上传路径 + String filePath = RuoYiConfig.getUploadPath(); + for (MultipartFile file : files) + { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } } AjaxResult ajax = AjaxResult.success(); ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index daa28a0..ada44c2 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -127,6 +127,14 @@ springdoc: paths-to-match: '/**' packages-to-scan: com.ruoyi.web.controller.tool +# MinIO配置 +minio: + enabled: true + endpoint: http://49.232.154.205:10900 + access-key: 4EsLD9g9OM09DT0HaBKj + secret-key: 05SFC5fleqTnaLRYBrxHiphMFYbGX5nYicj0WCHA + bucket: rtsp + # 防止XSS攻击 xss: # 过滤开关 diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 5456102..ef0ed4e 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -59,6 +59,13 @@ ruoyi-system + + + io.minio + minio + 8.5.11 + + \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MinioProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MinioProperties.java new file mode 100644 index 0000000..bd64dfc --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MinioProperties.java @@ -0,0 +1,39 @@ +package com.ruoyi.framework.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "minio") +public class MinioProperties { + /** 是否启用MinIO上传 */ + private boolean enabled = true; + /** MinIO服务端地址,例如 http://127.0.0.1:9000 */ + private String endpoint; + /** 访问key */ + private String accessKey; + /** 密钥 */ + private String secretKey; + /** 桶名称 */ + private String bucket; + /** 是否使用https */ + private boolean secure = false; + + public boolean isEnabled() { return enabled; } + public void setEnabled(boolean enabled) { this.enabled = enabled; } + + public String getEndpoint() { return endpoint; } + public void setEndpoint(String endpoint) { this.endpoint = endpoint; } + + public String getAccessKey() { return accessKey; } + public void setAccessKey(String accessKey) { this.accessKey = accessKey; } + + public String getSecretKey() { return secretKey; } + public void setSecretKey(String secretKey) { this.secretKey = secretKey; } + + public String getBucket() { return bucket; } + public void setBucket(String bucket) { this.bucket = bucket; } + + public boolean isSecure() { return secure; } + public void setSecure(boolean secure) { this.secure = secure; } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/service/MinioService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/service/MinioService.java new file mode 100644 index 0000000..4bf2ebd --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/service/MinioService.java @@ -0,0 +1,78 @@ +package com.ruoyi.framework.service; + +import com.ruoyi.framework.config.MinioProperties; +import com.ruoyi.common.utils.file.FileUploadUtils; +import io.minio.BucketExistsArgs; +import io.minio.MakeBucketArgs; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; + +@Service +public class MinioService { + + private final MinioClient minioClient; + private final MinioProperties properties; + + @Autowired + public MinioService(MinioProperties properties) { + this.properties = properties; + this.minioClient = MinioClient.builder() + .endpoint(properties.getEndpoint()) + .credentials(properties.getAccessKey(), properties.getSecretKey()) + .build(); + } + + public UploadResult upload(MultipartFile file) throws Exception { + ensureBucket(); + String objectName = FileUploadUtils.extractFilename(file); + try (InputStream is = file.getInputStream()) { + minioClient.putObject( + PutObjectArgs.builder() + .bucket(properties.getBucket()) + .object(objectName) + .stream(is, file.getSize(), -1) + .contentType(file.getContentType()) + .build() + ); + } + String url = buildObjectUrl(objectName); + return new UploadResult(objectName, url); + } + + public String buildObjectUrl(String objectName) { + String endpoint = properties.getEndpoint(); + if (endpoint.endsWith("/")) { + endpoint = endpoint.substring(0, endpoint.length() - 1); + } + return endpoint + "/" + properties.getBucket() + "/" + objectName; + } + + private void ensureBucket() throws Exception { + boolean exists = minioClient.bucketExists(BucketExistsArgs.builder() + .bucket(properties.getBucket()) + .build()); + if (!exists) { + minioClient.makeBucket(MakeBucketArgs.builder() + .bucket(properties.getBucket()) + .build()); + } + } + + public static class UploadResult { + private final String objectName; + private final String url; + + public UploadResult(String objectName, String url) { + this.objectName = objectName; + this.url = url; + } + + public String getObjectName() { return objectName; } + public String getUrl() { return url; } + } +} diff --git a/ruoyi-video/pom.xml b/ruoyi-video/pom.xml index 1744a8b..f6dd5be 100644 --- a/ruoyi-video/pom.xml +++ b/ruoyi-video/pom.xml @@ -71,6 +71,16 @@ commons-lang 2.6 + + org.testng + testng + 7.11.0 + compile + + + org.springframework + spring-aop +