修复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) {
BucketExistsArgs bucketExistArgs = BucketExistsArgs.builder().bucket(minioBucket.getBuketName()).build();
BucketExistsArgs bucketExistArgs = BucketExistsArgs.builder().bucket(minioBucket.getBucketName()).build();
boolean b = false;
try {
b = minioBucket.getClient().bucketExists(bucketExistArgs);
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.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);
} catch (Exception e) {
logger.error("数据桶:{} - 链接失败", minioBucket.getName());
throw new RuntimeException(e.getMessage());
}
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.InputStream;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.springframework.web.multipart.MultipartFile;
@ -10,37 +12,39 @@ import com.ruoyi.middleware.minio.exception.MinioClientErrorException;
import io.minio.GetObjectArgs;
import io.minio.GetObjectResponse;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import io.minio.http.Method;
public class MinioBucket {
private MinioClient client;
private String buketName;
private String bucketName;
public MinioBucket() {
}
public MinioBucket(MinioClient client, String buketName) {
public MinioBucket(MinioClient client, String bucketName) {
this.client = client;
this.buketName = buketName;
this.bucketName = bucketName;
}
public String getName() {
return buketName;
return bucketName;
}
public MinioClient getClient() {
return client;
}
public String getBuketName() {
return buketName;
public String getBucketName() {
return bucketName;
}
public void setBuketName(String buketName) {
this.buketName = buketName;
public void setBucketName(String buketName) {
this.bucketName = bucketName;
}
public void setClient(MinioClient client) {
@ -54,7 +58,7 @@ public class MinioBucket {
public void put(String filePath, String contentType, InputStream inputStream) throws Exception {
PutObjectArgs build = PutObjectArgs.builder().contentType(contentType)
.stream(inputStream, inputStream.available(), -1)
.bucket(this.buketName).object(filePath).build();
.bucket(bucketName).object(filePath).build();
put(build);
}
@ -67,7 +71,7 @@ public class MinioBucket {
}
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);
}
@ -84,7 +88,7 @@ public class MinioBucket {
* @throws IOException 比如读写文件出错时
*/
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);
MinioFileVO minioFileVO = new MinioFileVO();
@ -97,4 +101,14 @@ public class MinioBucket {
minioFileVO.setHeaders(inputStream.headers());
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.net.URL;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
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.utils.MinioUtil;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.http.Method;
/**
* Minio文件操作实现类
*/
@ -79,24 +74,7 @@ public class MinioFileService implements FileService {
* @throws MinioClientErrorException 如果在创建或获取预签名URL过程中发生错误时抛出
*/
@Override
public URL generatePresignedUrl(String filePath) throws MinioClientNotFundException, MinioClientErrorException {
MinioClient minioClient = null; // 创建并且实例化
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);
}
public URL generatePresignedUrl(String filePath) throws Exception {
return MinioUtil.generatePresignedUrl(filePath);
}
}

View File

@ -1,6 +1,7 @@
package com.ruoyi.middleware.minio.utils;
import java.io.IOException;
import java.net.URL;
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.uuid.UUID;
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.exception.MinioClientErrorException;
@ -121,4 +123,16 @@ public class MinioUtil {
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;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
@ -9,6 +11,7 @@ import org.springframework.web.multipart.MultipartFile;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
@ -117,4 +120,11 @@ public class AliOssBucket {
fileVO.setFilePath(filePath);
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.net.URL;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
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.domain.AliOssFileVO;
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)
public class AliOssFileService implements FileService {
private static final Logger logger = LoggerFactory.getLogger(AliOssConfig.class);
@Autowired
private AliOssConfig aliOssConfig;
@ -79,22 +72,6 @@ public class AliOssFileService implements FileService {
*/
@Override
public URL generatePresignedUrl(String filePath) throws AliOssClientNotFundException, AliOssClientErrorException {
OSS ossClient = null; // 创建并且实例化
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客户端资源
}
}
return AliOssUtil.generatePresignedUrl(filePath);
}
}

View File

@ -1,8 +1,8 @@
package com.ruoyi.alibaba.oss.utils;
import java.io.IOException;
import java.net.URL;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.alibaba.oss.config.AliOssConfig;
@ -17,7 +17,6 @@ import com.ruoyi.common.utils.uuid.UUID;
/**
* oss工具
*/
@Component
public class AliOssUtil {
private static AliOssConfig aliOssConfig;
@ -128,4 +127,14 @@ public class AliOssUtil {
}
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);
}
}