From a9ba3f6556adc4004a79de98933ec1bfc42cf84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=B0=8F=E5=B9=B3?= Date: Tue, 4 Mar 2025 16:45:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=89=B9=E6=80=A7=EF=BC=9A=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=A1=B6=E5=90=8D=E5=89=8D=E7=BC=80=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/MinioPlusProperties.java | 7 ++++ .../common/enums/StorageBucketEnums.java | 33 ++++++++++++++++--- .../engine/impl/StorageEngineServiceImpl.java | 16 +++++---- .../core/service/impl/StorageServiceImpl.java | 2 +- .../controller/StorageController.java | 2 +- .../controller/StorageController.java | 2 +- 6 files changed, 47 insertions(+), 15 deletions(-) diff --git a/minio-plus-common/src/main/java/org/liuxp/minioplus/common/config/MinioPlusProperties.java b/minio-plus-common/src/main/java/org/liuxp/minioplus/common/config/MinioPlusProperties.java index 426eb90..a8ff889 100644 --- a/minio-plus-common/src/main/java/org/liuxp/minioplus/common/config/MinioPlusProperties.java +++ b/minio-plus-common/src/main/java/org/liuxp/minioplus/common/config/MinioPlusProperties.java @@ -40,6 +40,13 @@ public class MinioPlusProperties { */ private String browserUrl; + /** + * 桶名前缀,默认为空。如果多个SDK连接同一个minio后端服务,可以配置不同的前缀来区分。 + * 可选参数,特殊字符不支持,需符合S3存储路径的命名规则 + * 具体规则参考 https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html + */ + private String bucketPrefix = ""; + /** * 上传预签名URL有效期,单位为分钟 * 可选参数,默认值为60分钟 diff --git a/minio-plus-common/src/main/java/org/liuxp/minioplus/common/enums/StorageBucketEnums.java b/minio-plus-common/src/main/java/org/liuxp/minioplus/common/enums/StorageBucketEnums.java index c2c65b5..8e16cf5 100644 --- a/minio-plus-common/src/main/java/org/liuxp/minioplus/common/enums/StorageBucketEnums.java +++ b/minio-plus-common/src/main/java/org/liuxp/minioplus/common/enums/StorageBucketEnums.java @@ -1,5 +1,6 @@ package org.liuxp.minioplus.common.enums; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ArrayUtil; import java.util.Arrays; @@ -93,18 +94,40 @@ public enum StorageBucketEnums { } /** - * 根据扩展名取得桶编码 + * 根据扩展名取得桶名 * @param suffix 扩展名 - * @return 桶编码 + * @param bucketPrefix 桶名前缀 + * @return 桶名 */ - public static String getBucketByFileSuffix(String suffix) { + public static String getBucketByFileSuffix(String suffix,String bucketPrefix) { - return Arrays.stream(StorageBucketEnums.values()) + String bucketName = Arrays.stream(StorageBucketEnums.values()) .filter(item -> ArrayUtil.contains(item.types, suffix)) .findFirst() .orElse(StorageBucketEnums.OTHER) .code; + if (CharSequenceUtil.isNotBlank(bucketPrefix)) { + bucketName = bucketPrefix + "-" + bucketName; + } + + return bucketName; } -} + /** + * 取得预览图桶名 + * @param bucketPrefix 桶名前缀 + * @return 桶名 + */ + public static String getPreviewBucket(String bucketPrefix) { + + String bucketName = StorageBucketEnums.IMAGE_PREVIEW.getCode(); + + if (CharSequenceUtil.isNotBlank(bucketPrefix)) { + bucketName = bucketPrefix + "-" + bucketName; + } + + return bucketName; + } + +} \ No newline at end of file diff --git a/minio-plus-core/src/main/java/org/liuxp/minioplus/core/engine/impl/StorageEngineServiceImpl.java b/minio-plus-core/src/main/java/org/liuxp/minioplus/core/engine/impl/StorageEngineServiceImpl.java index fda16bc..9901e3d 100644 --- a/minio-plus-core/src/main/java/org/liuxp/minioplus/core/engine/impl/StorageEngineServiceImpl.java +++ b/minio-plus-core/src/main/java/org/liuxp/minioplus/core/engine/impl/StorageEngineServiceImpl.java @@ -375,15 +375,17 @@ public class StorageEngineServiceImpl implements StorageEngineService { // 文件权限校验,元数据为空或者当前登录用户不是文件所有者时抛出异常 this.authentication(metadata, fileKey, userId); - if (!StorageBucketEnums.IMAGE.getCode().equals(metadata.getStorageBucket())) { - // 不是图片时,返回文件类型 + // 获取存储桶值,并检查是否为null或不包含IMAGE的Code + String storageBucket = metadata.getStorageBucket(); + if (storageBucket == null || !storageBucket.contains(StorageBucketEnums.IMAGE.getCode())) { + // 当存储桶为空或不包含IMAGE的Code时,返回文件后缀 return metadata.getFileSuffix(); } // 生成缩略图 generatePreviewImage(metadata); // 创建图片预览地址 - return minioS3Client.getPreviewUrl(metadata.getFileMimeType(), StorageBucketEnums.IMAGE_PREVIEW.getCode(), metadata.getStoragePath() + "/" + metadata.getFileMd5()); + return minioS3Client.getPreviewUrl(metadata.getFileMimeType(), StorageBucketEnums.getPreviewBucket(properties.getBucketPrefix()), metadata.getStoragePath() + "/" + metadata.getFileMd5()); } catch (Exception e) { // 打印日志 log.error(e.getMessage(), e); @@ -404,7 +406,7 @@ public class StorageEngineServiceImpl implements StorageEngineService { if (Boolean.FALSE.equals(metadata.getIsPreview())) { // 获取原图的bytes - byte[] imageOriginBytes = minioS3Client.getObject(StorageBucketEnums.IMAGE.getCode(), metadata.getStoragePath() + "/" + metadata.getFileMd5()); + byte[] imageOriginBytes = minioS3Client.getObject(metadata.getStorageBucket(), metadata.getStoragePath() + "/" + metadata.getFileMd5()); // 定义文件流 @Cleanup ByteArrayInputStream imageOriginInputStream = new ByteArrayInputStream(imageOriginBytes); @@ -419,7 +421,7 @@ public class StorageEngineServiceImpl implements StorageEngineService { byte[] previewImageBytes = previewImage.toByteArray(); @Cleanup ByteArrayInputStream previewImageInputStream = new ByteArrayInputStream(previewImageBytes); - minioS3Client.putObject(StorageBucketEnums.IMAGE_PREVIEW.getCode(), CommonUtil.getObjectName(metadata.getFileMd5()), previewImageInputStream, previewImageBytes.length, metadata.getFileMimeType()); + minioS3Client.putObject(StorageBucketEnums.getPreviewBucket(properties.getBucketPrefix()), CommonUtil.getObjectName(metadata.getFileMd5()), previewImageInputStream, previewImageBytes.length, metadata.getFileMimeType()); metadata.setIsPreview(Boolean.TRUE); FileMetadataInfoUpdateDTO fileMetadataInfoUpdateDTO = BeanUtil.copyProperties(metadata, FileMetadataInfoUpdateDTO.class); metadataRepository.update(fileMetadataInfoUpdateDTO); @@ -515,7 +517,7 @@ public class StorageEngineServiceImpl implements StorageEngineService { minioS3Client.removeObject(metadata.getStorageBucket(), metadata.getStoragePath() + "/" + metadata.getFileMd5()); if (Boolean.TRUE.equals(metadata.getIsPreview())) { // 当存在缩略图时,同步删除缩略图 - minioS3Client.removeObject(StorageBucketEnums.IMAGE_PREVIEW.getCode(), metadata.getStoragePath() + "/" + metadata.getFileMd5()); + minioS3Client.removeObject(StorageBucketEnums.getPreviewBucket(properties.getBucketPrefix()), metadata.getStoragePath() + "/" + metadata.getFileMd5()); } } } @@ -806,7 +808,7 @@ public class StorageEngineServiceImpl implements StorageEngineService { String fileMimeType = FileUtil.getMimeType(bo.getFullFileName()); // 存储桶 - bucketName = StorageBucketEnums.getBucketByFileSuffix(suffix); + bucketName = StorageBucketEnums.getBucketByFileSuffix(suffix,properties.getBucketPrefix()); // 创建桶 minioS3Client.makeBucket(bucketName); diff --git a/minio-plus-core/src/main/java/org/liuxp/minioplus/core/service/impl/StorageServiceImpl.java b/minio-plus-core/src/main/java/org/liuxp/minioplus/core/service/impl/StorageServiceImpl.java index 419141b..ff8fc4e 100644 --- a/minio-plus-core/src/main/java/org/liuxp/minioplus/core/service/impl/StorageServiceImpl.java +++ b/minio-plus-core/src/main/java/org/liuxp/minioplus/core/service/impl/StorageServiceImpl.java @@ -249,7 +249,7 @@ public class StorageServiceImpl implements StorageService { String fileMimeType = ContentTypeUtil.getContentType(suffix); // 根据文件后缀取得桶 - String storageBucket = StorageBucketEnums.getBucketByFileSuffix(suffix); + String storageBucket = StorageBucketEnums.getBucketByFileSuffix(suffix,properties.getBucketPrefix()); // 取得存储路径 String storagePath = CommonUtil.getPathByDate(); diff --git a/minio-plus-spring-boot-starter/minio-plus-all-springboot-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java b/minio-plus-spring-boot-starter/minio-plus-all-springboot-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java index 452468f..8b7bb61 100644 --- a/minio-plus-spring-boot-starter/minio-plus-all-springboot-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java +++ b/minio-plus-spring-boot-starter/minio-plus-all-springboot-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java @@ -173,7 +173,7 @@ public class StorageController implements StorageWebAPI { public void icon(String fileType) { try { // 根据文件后缀取得桶 - String storageBucket = StorageBucketEnums.getBucketByFileSuffix(fileType); + String storageBucket = StorageBucketEnums.getBucketByFileSuffix(fileType,""); ClassPathResource cpr = new ClassPathResource(storageBucket + ".png"); diff --git a/minio-plus-spring-boot-starter/minio-plus-all-springboot2-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java b/minio-plus-spring-boot-starter/minio-plus-all-springboot2-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java index 452468f..8b7bb61 100644 --- a/minio-plus-spring-boot-starter/minio-plus-all-springboot2-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java +++ b/minio-plus-spring-boot-starter/minio-plus-all-springboot2-starter/src/main/java/org/liuxp/minioplus/extension/controller/StorageController.java @@ -173,7 +173,7 @@ public class StorageController implements StorageWebAPI { public void icon(String fileType) { try { // 根据文件后缀取得桶 - String storageBucket = StorageBucketEnums.getBucketByFileSuffix(fileType); + String storageBucket = StorageBucketEnums.getBucketByFileSuffix(fileType,""); ClassPathResource cpr = new ClassPathResource(storageBucket + ".png");