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); + } + } +}