新特性:支持桶名前缀配置。

This commit is contained in:
刘小平 2025-03-04 16:45:25 +08:00
parent ece06e9f0b
commit a9ba3f6556
6 changed files with 47 additions and 15 deletions

View File

@ -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分钟

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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();

View File

@ -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");

View File

@ -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");