修复Minio和阿里云OSS中桶名称的拼写错误,添加生成预签名URL的方法

This commit is contained in:
Dftre 2025-02-23 18:07:55 +08:00
parent ca36af0868
commit 4fb15c1afa
7 changed files with 66 additions and 64 deletions

View File

@ -54,20 +54,20 @@ public class MinioConfig implements InitializingBean {
} }
private static void validateMinioBucket(MinioBucket minioBucket) { private static void validateMinioBucket(MinioBucket minioBucket) {
BucketExistsArgs bucketExistArgs = BucketExistsArgs.builder().bucket(minioBucket.getBuketName()).build(); BucketExistsArgs bucketExistArgs = BucketExistsArgs.builder().bucket(minioBucket.getBucketName()).build();
boolean b = false; boolean b = false;
try { try {
b = minioBucket.getClient().bucketExists(bucketExistArgs); b = minioBucket.getClient().bucketExists(bucketExistArgs);
PutObjectArgs putObjectArgs = PutObjectArgs.builder() PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.object(FileUtils.getRelativePath(RuoYiConfig.getProfile()) + "/") .object(FileUtils.getRelativePath(RuoYiConfig.getProfile()) + "/")
.stream(EmptyInputStream.nullInputStream(), 0, -1).bucket(minioBucket.getBuketName()).build(); .stream(EmptyInputStream.nullInputStream(), 0, -1).bucket(minioBucket.getBucketName()).build();
minioBucket.getClient().putObject(putObjectArgs); minioBucket.getClient().putObject(putObjectArgs);
} catch (Exception e) { } catch (Exception e) {
logger.error("数据桶:{} - 链接失败", minioBucket.getName()); logger.error("数据桶:{} - 链接失败", minioBucket.getName());
throw new RuntimeException(e.getMessage()); throw new RuntimeException(e.getMessage());
} }
if (!b) { if (!b) {
throw new RuntimeException("Bucket " + minioBucket.getBuketName() + " does not exist"); throw new RuntimeException("Bucket " + minioBucket.getBucketName() + " does not exist");
} }
} }

View File

@ -2,6 +2,8 @@ package com.ruoyi.middleware.minio.domain;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -10,37 +12,39 @@ import com.ruoyi.middleware.minio.exception.MinioClientErrorException;
import io.minio.GetObjectArgs; import io.minio.GetObjectArgs;
import io.minio.GetObjectResponse; import io.minio.GetObjectResponse;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient; import io.minio.MinioClient;
import io.minio.PutObjectArgs; import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs; import io.minio.RemoveObjectArgs;
import io.minio.http.Method;
public class MinioBucket { public class MinioBucket {
private MinioClient client; private MinioClient client;
private String buketName; private String bucketName;
public MinioBucket() { public MinioBucket() {
} }
public MinioBucket(MinioClient client, String buketName) { public MinioBucket(MinioClient client, String bucketName) {
this.client = client; this.client = client;
this.buketName = buketName; this.bucketName = bucketName;
} }
public String getName() { public String getName() {
return buketName; return bucketName;
} }
public MinioClient getClient() { public MinioClient getClient() {
return client; return client;
} }
public String getBuketName() { public String getBucketName() {
return buketName; return bucketName;
} }
public void setBuketName(String buketName) { public void setBucketName(String buketName) {
this.buketName = buketName; this.bucketName = bucketName;
} }
public void setClient(MinioClient client) { public void setClient(MinioClient client) {
@ -54,7 +58,7 @@ public class MinioBucket {
public void put(String filePath, String contentType, InputStream inputStream) throws Exception { public void put(String filePath, String contentType, InputStream inputStream) throws Exception {
PutObjectArgs build = PutObjectArgs.builder().contentType(contentType) PutObjectArgs build = PutObjectArgs.builder().contentType(contentType)
.stream(inputStream, inputStream.available(), -1) .stream(inputStream, inputStream.available(), -1)
.bucket(this.buketName).object(filePath).build(); .bucket(bucketName).object(filePath).build();
put(build); put(build);
} }
@ -67,7 +71,7 @@ public class MinioBucket {
} }
public void remove(String filePath) throws Exception { public void remove(String filePath) throws Exception {
RemoveObjectArgs build = RemoveObjectArgs.builder().object(filePath).bucket(buketName).build(); RemoveObjectArgs build = RemoveObjectArgs.builder().object(filePath).bucket(bucketName).build();
remove(build); remove(build);
} }
@ -84,7 +88,7 @@ public class MinioBucket {
* @throws IOException 比如读写文件出错时 * @throws IOException 比如读写文件出错时
*/ */
public MinioFileVO get(String filePath) throws Exception { public MinioFileVO get(String filePath) throws Exception {
GetObjectArgs getObjectArgs = GetObjectArgs.builder().object(filePath).bucket(buketName).build(); GetObjectArgs getObjectArgs = GetObjectArgs.builder().object(filePath).bucket(bucketName).build();
GetObjectResponse inputStream = this.client.getObject(getObjectArgs); GetObjectResponse inputStream = this.client.getObject(getObjectArgs);
MinioFileVO minioFileVO = new MinioFileVO(); MinioFileVO minioFileVO = new MinioFileVO();
@ -97,4 +101,14 @@ public class MinioBucket {
minioFileVO.setHeaders(inputStream.headers()); minioFileVO.setHeaders(inputStream.headers());
return minioFileVO; return minioFileVO;
} }
public URL generatePresignedUrl(String filePath) throws Exception {
GetPresignedObjectUrlArgs request = GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(filePath)
.expiry(1, TimeUnit.HOURS) // 设置过期时间为1小时
.build();
return new URL(client.getPresignedObjectUrl(request));
}
} }

View File

@ -2,7 +2,6 @@ package com.ruoyi.middleware.minio.service;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -21,10 +20,6 @@ import com.ruoyi.middleware.minio.exception.MinioClientErrorException;
import com.ruoyi.middleware.minio.exception.MinioClientNotFundException; import com.ruoyi.middleware.minio.exception.MinioClientNotFundException;
import com.ruoyi.middleware.minio.utils.MinioUtil; import com.ruoyi.middleware.minio.utils.MinioUtil;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.http.Method;
/** /**
* Minio文件操作实现类 * Minio文件操作实现类
*/ */
@ -79,24 +74,7 @@ public class MinioFileService implements FileService {
* @throws MinioClientErrorException 如果在创建或获取预签名URL过程中发生错误时抛出 * @throws MinioClientErrorException 如果在创建或获取预签名URL过程中发生错误时抛出
*/ */
@Override @Override
public URL generatePresignedUrl(String filePath) throws MinioClientNotFundException, MinioClientErrorException { public URL generatePresignedUrl(String filePath) throws Exception {
MinioClient minioClient = null; // 创建并且实例化 return MinioUtil.generatePresignedUrl(filePath);
try {
minioClient = minioConfig.getPrimaryMinioClient(); // 调用封装好的MinioConfig中的方法获取Minio客户端
String bucketName = minioConfig.getClient().get(minioConfig.getPrimary()).getBucketName();
GetPresignedObjectUrlArgs request = GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(filePath)
.expiry(1, TimeUnit.HOURS) // 设置过期时间为1小时
.build();
// 生成预签名URL
String presignedUrl = minioClient.getPresignedObjectUrl(request);
URL url = new URL(presignedUrl); // 将字符串形式的预签名URL转换为URL对象并返回
return url;
} catch (Exception e) {
logger.error("生成Minio预签名URL失败: {}", e.getMessage(), e); // 添加日志记录
throw new MinioClientErrorException("生成Minio预签名URL失败: " + e.getMessage(), e);
}
} }
} }

View File

@ -1,6 +1,7 @@
package com.ruoyi.middleware.minio.utils; package com.ruoyi.middleware.minio.utils;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -9,6 +10,7 @@ import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.UUID; import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.middleware.minio.config.MinioConfig; import com.ruoyi.middleware.minio.config.MinioConfig;
import com.ruoyi.middleware.minio.domain.MinioBucket;
import com.ruoyi.middleware.minio.domain.MinioFileVO; import com.ruoyi.middleware.minio.domain.MinioFileVO;
import com.ruoyi.middleware.minio.exception.MinioClientErrorException; import com.ruoyi.middleware.minio.exception.MinioClientErrorException;
@ -121,4 +123,16 @@ public class MinioUtil {
return getMinioConfig().getBucket(client).get(filePath); return getMinioConfig().getBucket(client).get(filePath);
} }
public static URL generatePresignedUrl(String filePath) throws Exception{
MinioBucket minioBucket = getMinioConfig().getMasterBucket();
return minioBucket.generatePresignedUrl(filePath);
}
public static URL generatePresignedUrl(String client, String filePath) throws Exception {
MinioBucket minioBucket = getMinioConfig().getBucket(client);
return minioBucket.generatePresignedUrl(filePath);
}
} }

View File

@ -1,6 +1,8 @@
package com.ruoyi.alibaba.oss.domain; package com.ruoyi.alibaba.oss.domain;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List; import java.util.List;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -9,6 +11,7 @@ import org.springframework.web.multipart.MultipartFile;
import com.aliyun.oss.OSS; import com.aliyun.oss.OSS;
import com.aliyun.oss.model.DeleteObjectsRequest; import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.GetObjectRequest; import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.ObjectMetadata;
@ -117,4 +120,11 @@ public class AliOssBucket {
fileVO.setFilePath(filePath); fileVO.setFilePath(filePath);
return fileVO; return fileVO;
} }
public URL generatePresignedUrl(String filePath){
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, filePath);
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000); // 设置过期时间为1小时
request.setExpiration(expiration);
return ossClient.generatePresignedUrl(request);
}
} }

View File

@ -2,17 +2,12 @@ package com.ruoyi.alibaba.oss.service;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.ruoyi.alibaba.oss.config.AliOssConfig; import com.ruoyi.alibaba.oss.config.AliOssConfig;
import com.ruoyi.alibaba.oss.domain.AliOssFileVO; import com.ruoyi.alibaba.oss.domain.AliOssFileVO;
import com.ruoyi.alibaba.oss.exception.AliOssClientErrorException; import com.ruoyi.alibaba.oss.exception.AliOssClientErrorException;
@ -30,8 +25,6 @@ import com.ruoyi.common.utils.file.FileUtils;
@ConditionalOnProperty(prefix = "oss", name = { "enable" }, havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "oss", name = { "enable" }, havingValue = "true", matchIfMissing = false)
public class AliOssFileService implements FileService { public class AliOssFileService implements FileService {
private static final Logger logger = LoggerFactory.getLogger(AliOssConfig.class);
@Autowired @Autowired
private AliOssConfig aliOssConfig; private AliOssConfig aliOssConfig;
@ -79,22 +72,6 @@ public class AliOssFileService implements FileService {
*/ */
@Override @Override
public URL generatePresignedUrl(String filePath) throws AliOssClientNotFundException, AliOssClientErrorException { public URL generatePresignedUrl(String filePath) throws AliOssClientNotFundException, AliOssClientErrorException {
OSS ossClient = null; // 创建并且实例化 return AliOssUtil.generatePresignedUrl(filePath);
try {
ossClient = aliOssConfig.getPrimaryOssClient(); // 调用封装好的AliOssConfig中的方法获取OSS客户端
String bucketName = aliOssConfig.getClient().get(aliOssConfig.getPrimary()).getBucketName();
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, filePath);
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000); // 设置过期时间为1小时
request.setExpiration(expiration);
// 生成预签名URL
return ossClient.generatePresignedUrl(request);
} catch (Exception e) {
logger.error("生成Oss预签名URL失败: {}", e.getMessage(), e); // 添加日志记录
throw new AliOssClientErrorException("生成Oss预签名URL失败: " + e.getMessage(), e);
} finally {
if (ossClient != null) {
ossClient.shutdown(); // 手动关闭OSS客户端资源
}
}
} }
} }

View File

@ -1,8 +1,8 @@
package com.ruoyi.alibaba.oss.utils; package com.ruoyi.alibaba.oss.utils;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.alibaba.oss.config.AliOssConfig; import com.ruoyi.alibaba.oss.config.AliOssConfig;
@ -17,7 +17,6 @@ import com.ruoyi.common.utils.uuid.UUID;
/** /**
* oss工具 * oss工具
*/ */
@Component
public class AliOssUtil { public class AliOssUtil {
private static AliOssConfig aliOssConfig; private static AliOssConfig aliOssConfig;
@ -128,4 +127,14 @@ public class AliOssUtil {
} }
return ossBucket.get(filePath); return ossBucket.get(filePath);
} }
public static URL generatePresignedUrl(String filePath) {
AliOssBucket ossBucket = getAliOssConfig().getMasterBucket();
return ossBucket.generatePresignedUrl(filePath);
}
public static URL generatePresignedUrl(String client, String filePath) {
AliOssBucket ossBucket = getAliOssConfig().getBucket(client);
return ossBucket.generatePresignedUrl(filePath);
}
} }