fix(storage): 规范化endpoint并指定MinIO客户端region

- 去除endpoint结尾斜杠,避免minio-java拼接双斜杠导致签名不匹配
- MinIO客户端构建时显式指定region为us-east-1
- 跳过MinIO SDK的自动getBucketLocation探测,避免反向代理环境下签名验证失败
- 修改AliOssController和FileRecordServiceImpl中相关代码逻辑
This commit is contained in:
2026-08-07 04:00:39 +08:00
parent 5ca3280ddc
commit e487f021dc
2 changed files with 14 additions and 0 deletions

View File

@@ -102,6 +102,11 @@ public class AliOssController extends BaseController {
String accessKeySecret = settingInfo.getString("accessKeySecret"); String accessKeySecret = settingInfo.getString("accessKeySecret");
String uploadMethod = settingInfo.getString("uploadMethod"); String uploadMethod = settingInfo.getString("uploadMethod");
// 规范化 endpoint去掉结尾斜杠避免 minio-java 拼接出双斜杠导致签名不匹配
if (StrUtil.isNotBlank(endpoint) && endpoint.endsWith("/")) {
endpoint = endpoint.substring(0, endpoint.length() - 1);
}
// 判断是否登录 // 判断是否登录
String authorization = getAuthorization(); String authorization = getAuthorization();
@@ -123,9 +128,12 @@ public class AliOssController extends BaseController {
OSS ossClient = null; OSS ossClient = null;
MinioClient minioClient = null; MinioClient minioClient = null;
if (isMinio) { if (isMinio) {
// 显式指定 region=us-east-1跳过 minio-java 的 getBucketLocation 自动探测
// (该探测 GET 在 MinIO + 反代下会触发 SignatureDoesNotMatch
minioClient = MinioClient.builder() minioClient = MinioClient.builder()
.endpoint(endpoint) .endpoint(endpoint)
.credentials(accessKeyId, accessKeySecret) .credentials(accessKeyId, accessKeySecret)
.region("us-east-1")
.build(); .build();
} else { } else {
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret); CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

View File

@@ -98,14 +98,20 @@ public class FileRecordServiceImpl extends ServiceImpl<FileRecordMapper, FileRec
String accessKeyId = uploadConfig.getString("accessKeyId"); String accessKeyId = uploadConfig.getString("accessKeyId");
String accessKeySecret = uploadConfig.getString("accessKeySecret"); String accessKeySecret = uploadConfig.getString("accessKeySecret");
String uploadMethod = uploadConfig.getString("uploadMethod"); String uploadMethod = uploadConfig.getString("uploadMethod");
// 规范化 endpoint去掉结尾斜杠避免 minio-java 拼接出双斜杠导致签名不匹配
if (StrUtil.isNotBlank(endpoint) && endpoint.endsWith("/")) {
endpoint = endpoint.substring(0, endpoint.length() - 1);
}
boolean isMinio = "minio".equals(uploadMethod); boolean isMinio = "minio".equals(uploadMethod);
OSS ossClient = null; OSS ossClient = null;
MinioClient minioClient = null; MinioClient minioClient = null;
if (isMinio) { if (isMinio) {
// MinIO 用官方 minio-java SDK原生 AWS4 + path-stylealiyun OSS SDK 无法对接 MinIO // MinIO 用官方 minio-java SDK原生 AWS4 + path-stylealiyun OSS SDK 无法对接 MinIO
// 显式指定 region=us-east-1跳过 getBucketLocation 自动探测(该探测 GET 会触发 SignatureDoesNotMatch
minioClient = MinioClient.builder() minioClient = MinioClient.builder()
.endpoint(endpoint) .endpoint(endpoint)
.credentials(accessKeyId, accessKeySecret) .credentials(accessKeyId, accessKeySecret)
.region("us-east-1")
.build(); .build();
} else { } else {
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret); CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);