fix(storage): 修复MinIO文件上传和配置问题

- 修复文件上传时缺少后缀名的问题,添加对无后缀文件的处理逻辑
- 更新开发和生产环境的OSS配置,修改endpoint、accessKey和secretKey
- 将文件大小限制从100调整为10
- 优化代码格式,修复方法参数换行和构建器链式调用的格式问题
- 统一多个版本中的MinIO仓库代码变更
This commit is contained in:
2026-02-27 16:54:16 +08:00
parent f9a8c58b68
commit 69b7c5d947
9 changed files with 101 additions and 77 deletions
@@ -45,11 +45,13 @@ import io.minio.messages.Bucket;
import io.minio.messages.Item;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -145,15 +147,25 @@ public class MinioRepository {
* @param md5 文件md5
* @return String 上传后的文件名,上传失败返回 null
*/
public SystemOssStorageTb upload(File tempFile, String originalFilename, long fileSize, String contentType,
String md5) {
public SystemOssStorageTb upload(
File tempFile, String originalFilename, long fileSize, String contentType,
String md5
) {
StorageOSSModel ossConfig = properties.getOss();
OSSConfigModel ossMinioConfig = ossConfig.getMinio();
String type = FileTypeUtil.getType(tempFile);
String prefix = KitFileUtil.getPrefix(tempFile);
String suffix = KitFileUtil.getSuffix(tempFile);
String fileCode = IdUtil.fastSimpleUUID();
String fileName = fileCode + FileUtil.getSuffix(originalFilename);
String fileName;
String realSuffix = FileUtil.getSuffix(originalFilename);
if (StrUtil.isBlank(realSuffix)) {
fileName = fileCode;
} else {
fileName = fileCode + "." + realSuffix;
}
String objectName = KitDateUtil.getNowDateStr() + "/" + fileName;
log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName;
@@ -279,8 +291,10 @@ public class MinioRepository {
public void download(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs);
FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
try (
GetObjectResponse response = minioClient.getObject(objectArgs);
FastByteArrayOutputStream os = new FastByteArrayOutputStream()
) {
byte[] buf = new byte[1024];
int len;
while ((len = response.read(buf)) != -1) {
@@ -187,12 +187,12 @@ app:
queue-capacity: 50
# oss
oss:
max-size: 100
max-size: 10
minio:
endpoint: http://127.0.0.1:9000
endpoint: https://oss.odboy.cn
bucketName: cutejava
accessKey: 8o5oVzqvKby5TzaGcfmx
secretKey: 8BiK5UbmvXGJNVQ98CGiohHzT1N1FMRZqHRdJllj
accessKey: 74rgxZtiYtOzsY9U8W9F
secretKey: 7d1BiBlfFQDBHKfwAWjF18TLUMjbd9VbSgnncsTw
captcha:
expireTime: 300
# 序列化白名单
@@ -198,12 +198,12 @@ app:
queue-capacity: 50
# oss
oss:
max-size: 100
max-size: 10
minio:
endpoint: http://127.0.0.1:9000
endpoint: https://oss.odboy.cn
bucketName: cutejava
accessKey: 8o5oVzqvKby5TzaGcfmx
secretKey: 8BiK5UbmvXGJNVQ98CGiohHzT1N1FMRZqHRdJllj
accessKey: 74rgxZtiYtOzsY9U8W9F
secretKey: 7d1BiBlfFQDBHKfwAWjF18TLUMjbd9VbSgnncsTw
captcha:
expireTime: 300
# 序列化白名单
@@ -45,11 +45,13 @@ import io.minio.messages.Bucket;
import io.minio.messages.Item;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -145,15 +147,24 @@ public class MinioRepository {
* @param md5 文件md5
* @return String 上传后的文件名,上传失败返回 null
*/
public SystemOssStorageTb upload(File tempFile, String originalFilename, long fileSize, String contentType,
String md5) {
public SystemOssStorageTb upload(
File tempFile, String originalFilename, long fileSize, String contentType, String md5
) {
StorageOSSModel ossConfig = properties.getOss();
OSSConfigModel ossMinioConfig = ossConfig.getMinio();
String type = FileTypeUtil.getType(tempFile);
String prefix = KitFileUtil.getPrefix(tempFile);
String suffix = KitFileUtil.getSuffix(tempFile);
String fileCode = IdUtil.fastSimpleUUID();
String fileName = fileCode + FileUtil.getSuffix(originalFilename);
String fileName;
String realSuffix = FileUtil.getSuffix(originalFilename);
if (StrUtil.isBlank(realSuffix)) {
fileName = fileCode;
} else {
fileName = fileCode + "." + realSuffix;
}
String objectName = KitDateUtil.getNowDateStr() + "/" + fileName;
log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName;
@@ -171,8 +182,8 @@ public class MinioRepository {
systemOssStorageTb.setFileCode(fileCode);
systemOssStorageTb.setObjectName(objectName);
try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName)
.stream(fileInputStream, fileSize, -1).contentType(contentType).build();
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName).stream(fileInputStream, fileSize, -1)
.contentType(contentType).build();
minioClient.putObject(objectArgs);
log.info("文件上传成功,并删除临时文件,文件名:{}", originalFilename);
return systemOssStorageTb;
@@ -206,8 +217,7 @@ public class MinioRepository {
String objectName = KitDateUtil.getNowDateTimeStr() + "/" + fileName;
log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
try (InputStream fileInputStream = file.getInputStream()) {
PutObjectArgs objectArgs =
PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName)
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName)
.stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build();
// 使用重试机制进行上传
uploadWithRetry(objectArgs, 3);
@@ -256,8 +266,7 @@ public class MinioRepository {
return null;
}
try {
GetPresignedObjectUrlArgs presignedUrlArgs =
GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName())
GetPresignedObjectUrlArgs presignedUrlArgs = GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName())
.object(fullFileName).method(Method.GET)
// 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了
.expiry(3600 * 24 * 7).build();
@@ -277,10 +286,10 @@ public class MinioRepository {
* @param res HTTP 响应
*/
public void download(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs);
FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (
GetObjectResponse response = minioClient.getObject(objectArgs); FastByteArrayOutputStream os = new FastByteArrayOutputStream()
) {
byte[] buf = new byte[1024];
int len;
while ((len = response.read(buf)) != -1) {
@@ -306,8 +315,7 @@ public class MinioRepository {
* @param res HTTP 响应
*/
public void downloadOptimizedVersion(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
// 增大缓冲区
byte[] buf = new byte[1024 * 4];
@@ -338,8 +346,7 @@ public class MinioRepository {
*/
public List<Item> queryAllObjects() {
try {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build());
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build());
List<Item> items = new ArrayList<>();
for (Result<Item> result : results) {
items.add(result.get());
@@ -359,9 +366,7 @@ public class MinioRepository {
*/
public boolean removeBucketFile(String fileName) {
try {
minioClient.removeObject(
RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName)
.build());
minioClient.removeObject(RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build());
log.info("删除文件成功,fileName: {}", fileName);
return true;
} catch (Exception e) {
@@ -125,12 +125,12 @@ app:
queue-capacity: 50
# oss
oss:
max-size: 100
max-size: 10
minio:
endpoint: http://127.0.0.1:9000
endpoint: https://oss.odboy.cn
bucketName: cutejava
accessKey: 8o5oVzqvKby5TzaGcfmx
secretKey: 8BiK5UbmvXGJNVQ98CGiohHzT1N1FMRZqHRdJllj
accessKey: 74rgxZtiYtOzsY9U8W9F
secretKey: 7d1BiBlfFQDBHKfwAWjF18TLUMjbd9VbSgnncsTw
captcha:
expireTime: 300
# 序列化白名单
@@ -136,12 +136,12 @@ app:
queue-capacity: 50
# oss
oss:
max-size: 100
max-size: 10
minio:
endpoint: http://127.0.0.1:9000
endpoint: https://oss.odboy.cn
bucketName: cutejava
accessKey: 8o5oVzqvKby5TzaGcfmx
secretKey: 8BiK5UbmvXGJNVQ98CGiohHzT1N1FMRZqHRdJllj
accessKey: 74rgxZtiYtOzsY9U8W9F
secretKey: 7d1BiBlfFQDBHKfwAWjF18TLUMjbd9VbSgnncsTw
captcha:
expireTime: 300
# 序列化白名单
@@ -43,6 +43,7 @@ import io.minio.Result;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
@@ -50,6 +51,7 @@ import java.util.Collections;
import java.util.List;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -145,15 +147,24 @@ public class MinioRepository {
* @param md5 文件md5
* @return String 上传后的文件名,上传失败返回 null
*/
public SystemOssStorageTb upload(File tempFile, String originalFilename, long fileSize, String contentType,
String md5) {
public SystemOssStorageTb upload(
File tempFile, String originalFilename, long fileSize, String contentType, String md5
) {
StorageOSSModel ossConfig = properties.getOss();
OSSConfigModel ossMinioConfig = ossConfig.getMinio();
String type = FileTypeUtil.getType(tempFile);
String prefix = KitFileUtil.getPrefix(tempFile);
String suffix = KitFileUtil.getSuffix(tempFile);
String fileCode = IdUtil.fastSimpleUUID();
String fileName = fileCode + FileUtil.getSuffix(originalFilename);
String fileName;
String realSuffix = FileUtil.getSuffix(originalFilename);
if (StrUtil.isBlank(realSuffix)) {
fileName = fileCode;
} else {
fileName = fileCode + "." + realSuffix;
}
String objectName = KitDateUtil.getNowDateStr() + "/" + fileName;
log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName;
@@ -171,8 +182,8 @@ public class MinioRepository {
systemOssStorageTb.setFileCode(fileCode);
systemOssStorageTb.setObjectName(objectName);
try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName)
.stream(fileInputStream, fileSize, -1).contentType(contentType).build();
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName).stream(fileInputStream, fileSize, -1)
.contentType(contentType).build();
minioClient.putObject(objectArgs);
log.info("文件上传成功,并删除临时文件,文件名:{}", originalFilename);
return systemOssStorageTb;
@@ -206,8 +217,7 @@ public class MinioRepository {
String objectName = KitDateUtil.getNowDateTimeStr() + "/" + fileName;
log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
try (InputStream fileInputStream = file.getInputStream()) {
PutObjectArgs objectArgs =
PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName)
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName)
.stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build();
// 使用重试机制进行上传
uploadWithRetry(objectArgs, 3);
@@ -256,8 +266,7 @@ public class MinioRepository {
return null;
}
try {
GetPresignedObjectUrlArgs presignedUrlArgs =
GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName())
GetPresignedObjectUrlArgs presignedUrlArgs = GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName())
.object(fullFileName).method(Method.GET)
// 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了
.expiry(3600 * 24 * 7).build();
@@ -277,10 +286,10 @@ public class MinioRepository {
* @param res HTTP 响应
*/
public void download(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs);
FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (
GetObjectResponse response = minioClient.getObject(objectArgs); FastByteArrayOutputStream os = new FastByteArrayOutputStream()
) {
byte[] buf = new byte[1024];
int len;
while ((len = response.read(buf)) != -1) {
@@ -306,8 +315,7 @@ public class MinioRepository {
* @param res HTTP 响应
*/
public void downloadOptimizedVersion(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
// 增大缓冲区
byte[] buf = new byte[1024 * 4];
@@ -338,8 +346,7 @@ public class MinioRepository {
*/
public List<Item> queryAllObjects() {
try {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build());
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build());
List<Item> items = new ArrayList<>();
for (Result<Item> result : results) {
items.add(result.get());
@@ -359,9 +366,7 @@ public class MinioRepository {
*/
public boolean removeBucketFile(String fileName) {
try {
minioClient.removeObject(
RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName)
.build());
minioClient.removeObject(RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build());
log.info("删除文件成功,fileName: {}", fileName);
return true;
} catch (Exception e) {
@@ -203,12 +203,12 @@ app:
queue-capacity: 50
# oss
oss:
max-size: 100
max-size: 10
minio:
endpoint: http://192.168.100.128:9000
endpoint: https://oss.odboy.cn
bucketName: cutejava
accessKey: 8o5oVzqvKby5TzaGcfmx
secretKey: 8BiK5UbmvXGJNVQ98CGiohHzT1N1FMRZqHRdJllj
accessKey: 74rgxZtiYtOzsY9U8W9F
secretKey: 7d1BiBlfFQDBHKfwAWjF18TLUMjbd9VbSgnncsTw
captcha:
expireTime: 300
# 序列化白名单
@@ -202,12 +202,12 @@ app:
queue-capacity: 50
# oss
oss:
max-size: 100
max-size: 10
minio:
endpoint: http://192.168.100.128:9000
endpoint: https://oss.odboy.cn
bucketName: cutejava
accessKey: 8o5oVzqvKby5TzaGcfmx
secretKey: 8BiK5UbmvXGJNVQ98CGiohHzT1N1FMRZqHRdJllj
accessKey: 74rgxZtiYtOzsY9U8W9F
secretKey: 7d1BiBlfFQDBHKfwAWjF18TLUMjbd9VbSgnncsTw
captcha:
expireTime: 300
# 序列化白名单