From 69b7c5d947523b3cac5ca338acad75315310e94f Mon Sep 17 00:00:00 2001 From: Odboy Date: Thu, 26 Feb 2026 22:34:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(storage):=20=E4=BF=AE=E5=A4=8DMinIO?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=92=8C=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复文件上传时缺少后缀名的问题,添加对无后缀文件的处理逻辑 - 更新开发和生产环境的OSS配置,修改endpoint、accessKey和secretKey - 将文件大小限制从100调整为10 - 优化代码格式,修复方法参数换行和构建器链式调用的格式问题 - 统一多个版本中的MinIO仓库代码变更 --- .../storage/minio/MinioRepository.java | 24 +++++++-- .../src/main/resources/application-dev.yml | 8 +-- .../src/main/resources/application-prod.yml | 8 +-- .../storage/minio/MinioRepository.java | 53 ++++++++++--------- .../src/main/resources/application-dev.yml | 8 +-- .../src/main/resources/application-prod.yml | 8 +-- .../storage/minio/MinioRepository.java | 53 ++++++++++--------- .../src/main/resources/application-dev.yml | 8 +-- .../src/main/resources/application-prod.yml | 8 +-- 9 files changed, 101 insertions(+), 77 deletions(-) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java index fc55cb47..fd681a8d 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java @@ -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) { diff --git a/cutejava-springboot3/cutejava-starter/src/main/resources/application-dev.yml b/cutejava-springboot3/cutejava-starter/src/main/resources/application-dev.yml index 43649ebc..10ccb354 100644 --- a/cutejava-springboot3/cutejava-starter/src/main/resources/application-dev.yml +++ b/cutejava-springboot3/cutejava-starter/src/main/resources/application-dev.yml @@ -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 # 序列化白名单 diff --git a/cutejava-springboot3/cutejava-starter/src/main/resources/application-prod.yml b/cutejava-springboot3/cutejava-starter/src/main/resources/application-prod.yml index 2b5e0e3b..0900622e 100644 --- a/cutejava-springboot3/cutejava-starter/src/main/resources/application-prod.yml +++ b/cutejava-springboot3/cutejava-starter/src/main/resources/application-prod.yml @@ -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 # 序列化白名单 diff --git a/cutejava-springboot4/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java b/cutejava-springboot4/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java index fc55cb47..8c769e53 100644 --- a/cutejava-springboot4/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java +++ b/cutejava-springboot4/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java @@ -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,9 +217,8 @@ 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) - .stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); + PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName) + .stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); // 使用重试机制进行上传 uploadWithRetry(objectArgs, 3); log.info("文件上传成功,objectName: {}", objectName); @@ -256,11 +266,10 @@ public class MinioRepository { return null; } try { - GetPresignedObjectUrlArgs presignedUrlArgs = - GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()) - .object(fullFileName).method(Method.GET) - // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 - .expiry(3600 * 24 * 7).build(); + GetPresignedObjectUrlArgs presignedUrlArgs = GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()) + .object(fullFileName).method(Method.GET) + // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 + .expiry(3600 * 24 * 7).build(); String url = minioClient.getPresignedObjectUrl(presignedUrlArgs); log.info("生成预签名 URL 成功,fileName: {}, url: {}", fullFileName, url); return url; @@ -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 queryAllObjects() { try { - Iterable> results = minioClient.listObjects( - ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); + Iterable> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); List items = new ArrayList<>(); for (Result 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) { diff --git a/cutejava-springboot4/cutejava-starter/src/main/resources/application-dev.yml b/cutejava-springboot4/cutejava-starter/src/main/resources/application-dev.yml index 42c4abee..7b3ce5d0 100644 --- a/cutejava-springboot4/cutejava-starter/src/main/resources/application-dev.yml +++ b/cutejava-springboot4/cutejava-starter/src/main/resources/application-dev.yml @@ -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 # 序列化白名单 diff --git a/cutejava-springboot4/cutejava-starter/src/main/resources/application-prod.yml b/cutejava-springboot4/cutejava-starter/src/main/resources/application-prod.yml index 9521256d..efdb2c84 100644 --- a/cutejava-springboot4/cutejava-starter/src/main/resources/application-prod.yml +++ b/cutejava-springboot4/cutejava-starter/src/main/resources/application-prod.yml @@ -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 # 序列化白名单 diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java index 1c98f2b1..85837a4b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java @@ -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,9 +217,8 @@ 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) - .stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); + PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName) + .stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); // 使用重试机制进行上传 uploadWithRetry(objectArgs, 3); log.info("文件上传成功,objectName: {}", objectName); @@ -256,11 +266,10 @@ public class MinioRepository { return null; } try { - GetPresignedObjectUrlArgs presignedUrlArgs = - GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()) - .object(fullFileName).method(Method.GET) - // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 - .expiry(3600 * 24 * 7).build(); + GetPresignedObjectUrlArgs presignedUrlArgs = GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()) + .object(fullFileName).method(Method.GET) + // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 + .expiry(3600 * 24 * 7).build(); String url = minioClient.getPresignedObjectUrl(presignedUrlArgs); log.info("生成预签名 URL 成功,fileName: {}, url: {}", fullFileName, url); return url; @@ -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 queryAllObjects() { try { - Iterable> results = minioClient.listObjects( - ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); + Iterable> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); List items = new ArrayList<>(); for (Result 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) { diff --git a/cutejava/cutejava-starter/src/main/resources/application-dev.yml b/cutejava/cutejava-starter/src/main/resources/application-dev.yml index 9e27ecb1..edb719e1 100644 --- a/cutejava/cutejava-starter/src/main/resources/application-dev.yml +++ b/cutejava/cutejava-starter/src/main/resources/application-dev.yml @@ -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 # 序列化白名单 diff --git a/cutejava/cutejava-starter/src/main/resources/application-prod.yml b/cutejava/cutejava-starter/src/main/resources/application-prod.yml index a22691f9..b880a0bd 100644 --- a/cutejava/cutejava-starter/src/main/resources/application-prod.yml +++ b/cutejava/cutejava-starter/src/main/resources/application-prod.yml @@ -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 # 序列化白名单