From 28451fc538ddea54ca7764936e5c7a4a44e7328e Mon Sep 17 00:00:00 2001
From: D <3066417822@qq.com>
Date: Sat, 20 Apr 2024 01:43:32 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E9=80=89=E6=8B=A9=E9=9B=86?=
=?UTF-8?q?=E6=88=90minio?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 16 ++++
ruoyi-admin/pom.xml | 6 ++
.../src/main/resources/application-minio.yml | 6 ++
.../src/main/resources/application.yml | 2 +-
ruoyi-minio/pom.xml | 33 ++++++++
.../com/ruoyi/minio/config/MinioConfig.java | 80 ++++++++++++++++++
.../minio/controller/MinioController.java | 32 +++++++
.../minio/utils/FileUploadMinioUtils.java | 84 +++++++++++++++++++
.../java/com/ruoyi/minio/utils/MinioUtil.java | 46 ++++++++++
9 files changed, 304 insertions(+), 1 deletion(-)
create mode 100644 ruoyi-admin/src/main/resources/application-minio.yml
create mode 100644 ruoyi-minio/pom.xml
create mode 100644 ruoyi-minio/src/main/java/com/ruoyi/minio/config/MinioConfig.java
create mode 100644 ruoyi-minio/src/main/java/com/ruoyi/minio/controller/MinioController.java
create mode 100644 ruoyi-minio/src/main/java/com/ruoyi/minio/utils/FileUploadMinioUtils.java
create mode 100644 ruoyi-minio/src/main/java/com/ruoyi/minio/utils/MinioUtil.java
diff --git a/pom.xml b/pom.xml
index 5d0344a..e2bebbb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,7 @@
2.3.1
2.1.0
6.0.0
+ 8.2.1
@@ -198,6 +199,13 @@
${jakarta.version}
+
+
+ io.minio
+ minio
+ ${minio.version}
+
+
com.ruoyi
@@ -260,6 +268,13 @@
ruoyi-mybatis-jpa
${ruoyi.version}
+
+
+
+ com.ruoyi
+ ruoyi-minio
+ ${ruoyi.version}
+
@@ -274,6 +289,7 @@
ruoyi-pay
ruoyi-online
ruoyi-mybatis-jpa
+ ruoyi-minio
pom
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index b45176f..a86aa3d 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,6 +75,12 @@
ruoyi-mybatis-jpa
+
+
+ com.ruoyi
+ ruoyi-minio
+
+
com.github.xiaoymin
diff --git a/ruoyi-admin/src/main/resources/application-minio.yml b/ruoyi-admin/src/main/resources/application-minio.yml
new file mode 100644
index 0000000..1fcd6a3
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/application-minio.yml
@@ -0,0 +1,6 @@
+# Minio配置
+minio:
+ url: http://localhost:9000
+ accessKey: minioadmin
+ secretKey: minioadmin
+ bucketName: ruoyi
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index d03ddb1..4f5d752 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -55,7 +55,7 @@ spring:
# 国际化资源文件路径
basename: i18n/messages
profiles:
- active: druid,mybatis,oauth,pay
+ active: druid,mybatis,oauth,pay,minio
# 文件上传
servlet:
multipart:
diff --git a/ruoyi-minio/pom.xml b/ruoyi-minio/pom.xml
new file mode 100644
index 0000000..fa8567d
--- /dev/null
+++ b/ruoyi-minio/pom.xml
@@ -0,0 +1,33 @@
+
+
+
+ ruoyi
+ com.ruoyi
+ 3.8.7.3.2
+
+ 4.0.0
+
+ ruoyi-minio
+
+
+ minio文件上传模块
+
+
+
+
+
+
+ com.ruoyi
+ ruoyi-common
+
+
+
+
+ io.minio
+ minio
+
+
+
+
+
diff --git a/ruoyi-minio/src/main/java/com/ruoyi/minio/config/MinioConfig.java b/ruoyi-minio/src/main/java/com/ruoyi/minio/config/MinioConfig.java
new file mode 100644
index 0000000..bb0ec0c
--- /dev/null
+++ b/ruoyi-minio/src/main/java/com/ruoyi/minio/config/MinioConfig.java
@@ -0,0 +1,80 @@
+package com.ruoyi.minio.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import io.minio.MinioClient;
+
+/**
+ * Minio 配置信息
+ *
+ * @author ruoyi
+ */
+@Configuration
+@ConfigurationProperties(prefix = "minio")
+public class MinioConfig {
+
+ /**
+ * 服务地址
+ */
+ private static String url;
+
+ /**
+ * 用户名
+ */
+ private static String accessKey;
+
+ /**
+ * 密码
+ */
+ private static String secretKey;
+
+ /**
+ * 存储桶名称
+ */
+ private static String bucketName;
+
+ public static String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ MinioConfig.url = url;
+ }
+
+ public static String getAccessKey() {
+ return accessKey;
+ }
+
+ public void setAccessKey(String accessKey) {
+ MinioConfig.accessKey = accessKey;
+ }
+
+ public static String getSecretKey() {
+ return secretKey;
+ }
+
+ public void setSecretKey(String secretKey) {
+ MinioConfig.secretKey = secretKey;
+ }
+
+ public static String getBucketName() {
+ return bucketName;
+ }
+
+ public void setBucketName(String bucketName) {
+ MinioConfig.bucketName = bucketName;
+ }
+
+ @Bean
+ public MinioClient getMinioClient() {
+ try {
+ return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
+ } catch (Exception e) {
+
+ return null;
+ }
+
+ }
+}
diff --git a/ruoyi-minio/src/main/java/com/ruoyi/minio/controller/MinioController.java b/ruoyi-minio/src/main/java/com/ruoyi/minio/controller/MinioController.java
new file mode 100644
index 0000000..f66092c
--- /dev/null
+++ b/ruoyi-minio/src/main/java/com/ruoyi/minio/controller/MinioController.java
@@ -0,0 +1,32 @@
+package com.ruoyi.minio.controller;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.minio.utils.FileUploadMinioUtils;
+
+@RestController
+@RequestMapping("/minio")
+public class MinioController {
+ @PostMapping("/upload")
+ @Anonymous
+ public AjaxResult uploadFileMinio(MultipartFile file) throws Exception {
+ try {
+ // 上传并返回新文件名称
+ String fileName = FileUploadMinioUtils.uploadMinio(file);
+ AjaxResult ajax = AjaxResult.success();
+ ajax.put("url", fileName);
+ ajax.put("fileName", fileName);
+ ajax.put("newFileName", FileUtils.getName(fileName));
+ ajax.put("originalFilename", file.getOriginalFilename());
+ return ajax;
+ } catch (Exception e) {
+ return AjaxResult.error(e.getMessage());
+ }
+ }
+}
diff --git a/ruoyi-minio/src/main/java/com/ruoyi/minio/utils/FileUploadMinioUtils.java b/ruoyi-minio/src/main/java/com/ruoyi/minio/utils/FileUploadMinioUtils.java
new file mode 100644
index 0000000..792eada
--- /dev/null
+++ b/ruoyi-minio/src/main/java/com/ruoyi/minio/utils/FileUploadMinioUtils.java
@@ -0,0 +1,84 @@
+package com.ruoyi.minio.utils;
+
+import java.io.IOException;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException;
+import com.ruoyi.common.exception.file.FileSizeLimitExceededException;
+import com.ruoyi.common.exception.file.InvalidExtensionException;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.MimeTypeUtils;
+import com.ruoyi.minio.config.MinioConfig;
+
+public class FileUploadMinioUtils extends FileUploadUtils {
+ /**
+ * Minio默认上传的地址
+ */
+ private static String bucketName = MinioConfig.getBucketName();
+
+ public static String getBucketName()
+ {
+ return bucketName;
+ }
+
+ /**
+ * 以默认BucketName配置上传到Minio服务器
+ *
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws Exception
+ */
+ public static final String uploadMinio(MultipartFile file) throws IOException
+ {
+ try
+ {
+ return uploadMinino(getBucketName(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 自定义bucketName配置上传到Minio服务器
+ *
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws Exception
+ */
+ public static final String uploadMinio(MultipartFile file, String bucketName) throws IOException
+ {
+ try
+ {
+ return uploadMinino(bucketName, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+
+ private static final String uploadMinino(String bucketName, MultipartFile file, String[] allowedExtension)
+ throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+ InvalidExtensionException
+ {
+ int fileNamelength = file.getOriginalFilename().length();
+ if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+ {
+ throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+ }
+ assertAllowed(file, allowedExtension);
+ try
+ {
+ String fileName = extractFilename(file);
+ String pathFileName = MinioUtil.uploadFile(bucketName, fileName, file);
+ return pathFileName;
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+}
diff --git a/ruoyi-minio/src/main/java/com/ruoyi/minio/utils/MinioUtil.java b/ruoyi-minio/src/main/java/com/ruoyi/minio/utils/MinioUtil.java
new file mode 100644
index 0000000..a756a70
--- /dev/null
+++ b/ruoyi-minio/src/main/java/com/ruoyi/minio/utils/MinioUtil.java
@@ -0,0 +1,46 @@
+package com.ruoyi.minio.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
+
+import io.minio.GetPresignedObjectUrlArgs;
+import io.minio.MinioClient;
+import io.minio.PutObjectArgs;
+import io.minio.http.Method;
+
+/**
+ * Minio 文件存储工具类
+ *
+ * @author ruoyi
+ */
+public class MinioUtil
+{
+ /**
+ * 上传文件
+ *
+ * @param bucketName 桶名称
+ * @param fileName
+ * @throws IOException
+ */
+ public static String uploadFile(String bucketName, String fileName, MultipartFile multipartFile) throws IOException
+ {
+ String url = "";
+ MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
+ try (InputStream inputStream = multipartFile.getInputStream())
+ {
+ minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream, multipartFile.getSize(), -1).contentType(multipartFile.getContentType()).build());
+ url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(fileName).method(Method.GET).build());
+ url = url.substring(0, url.indexOf('?'));
+ return ServletUtils.urlDecode(url);
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+}