diff --git a/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/config/GatewayWebClientConfiguration.java b/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/config/GatewayWebClientConfiguration.java index 9a32813f..2945f5ed 100644 --- a/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/config/GatewayWebClientConfiguration.java +++ b/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/config/GatewayWebClientConfiguration.java @@ -12,7 +12,7 @@ public class GatewayWebClientConfiguration { private final int maxInMemorySize; public GatewayWebClientConfiguration( - @Value("${databus.gateway.web-client.max-in-memory-size:2097152}") int maxInMemorySize) { + @Value("${databus.gateway.web-client.max-in-memory-size:20971520}") int maxInMemorySize) { this.maxInMemorySize = maxInMemorySize; } diff --git a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java index a97fd947..101a2654 100644 --- a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java +++ b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java @@ -76,6 +76,13 @@ public class FileController { return success(fileWhitReturn); } + @PostMapping("/upload-base64-with-return") + @Operation(summary = "上传文件(Base64编码)携带返回实体", description = "支持通过Base64编码上传文件内容,并返回完整文件信息") + public CommonResult uploadFileBase64WithReturn(@Valid @RequestBody FileUploadBase64ReqVO uploadReqVO) throws Exception { + FileRespVO fileRespVO = fileService.createFileFromBase64WithReturn(uploadReqVO); + return success(fileRespVO); + } + @GetMapping("/presigned-url") @Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器") @Parameters({ diff --git a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/vo/file/FileUploadBase64ReqVO.java b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/vo/file/FileUploadBase64ReqVO.java new file mode 100644 index 00000000..2dc4a667 --- /dev/null +++ b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/vo/file/FileUploadBase64ReqVO.java @@ -0,0 +1,28 @@ +package com.zt.plat.module.infra.controller.admin.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * @author chenbowen + */ +@Schema(description = "管理后台 - 上传文件(Base64编码) Request VO") +@Data +public class FileUploadBase64ReqVO { + + @Schema(description = "文件内容(Base64编码)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "文件内容不能为空") + private String base64Content; + + @Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "example.pdf") + @NotBlank(message = "文件名称不能为空") + private String fileName; + + @Schema(description = "文件目录", example = "XXX/YYY") + private String directory; + + @Schema(description = "是否加密", example = "false") + private Boolean encrypt = false; + +} diff --git a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileService.java b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileService.java index 982820d1..96e6b3d4 100644 --- a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileService.java +++ b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileService.java @@ -5,6 +5,7 @@ import com.zt.plat.module.infra.controller.admin.file.vo.file.FileCreateReqVO; import com.zt.plat.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.zt.plat.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO; import com.zt.plat.module.infra.controller.admin.file.vo.file.FileRespVO; +import com.zt.plat.module.infra.controller.admin.file.vo.file.FileUploadBase64ReqVO; import com.zt.plat.module.infra.dal.dataobject.file.FileDO; import jakarta.validation.constraints.NotEmpty; import lombok.SneakyThrows; @@ -41,6 +42,14 @@ public interface FileService { @SneakyThrows FileRespVO createFileWhitReturn(byte[] content, String name, String directory, String type, Boolean encrypt); + /** + * 通过 Base64 编码内容保存文件,并返回完整的文件信息 + * + * @param uploadReqVO Base64上传请求VO + * @return 文件信息 + */ + FileRespVO createFileFromBase64WithReturn(FileUploadBase64ReqVO uploadReqVO) throws Exception; + /** * 生成文件预签名地址信息 * diff --git a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileServiceImpl.java b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileServiceImpl.java index 8a699ce1..2c62ec69 100644 --- a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileServiceImpl.java +++ b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/service/file/FileServiceImpl.java @@ -12,6 +12,7 @@ import com.zt.plat.module.infra.controller.admin.file.vo.file.FileCreateReqVO; import com.zt.plat.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.zt.plat.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO; import com.zt.plat.module.infra.controller.admin.file.vo.file.FileRespVO; +import com.zt.plat.module.infra.controller.admin.file.vo.file.FileUploadBase64ReqVO; import com.zt.plat.module.infra.dal.dataobject.file.FileDO; import com.zt.plat.module.infra.dal.mysql.file.FileMapper; import com.zt.plat.module.infra.dal.redis.RedisKeyConstants; @@ -133,6 +134,38 @@ public class FileServiceImpl implements FileService { return BeanUtils.toBean(entity, FileRespVO.class); } + @Override + public FileRespVO createFileFromBase64WithReturn(FileUploadBase64ReqVO uploadReqVO) throws Exception { + // 1. 解码 Base64 内容 + byte[] content = decodeBase64Content(uploadReqVO.getBase64Content()); + + // 2. 推断文件类型 + String contentType = FileTypeUtils.getMineType(content, uploadReqVO.getFileName()); + + // 3. 上传文件并返回完整信息 + return createFileWhitReturn(content, uploadReqVO.getFileName(), uploadReqVO.getDirectory(), + contentType, uploadReqVO.getEncrypt()); + } + + /** + * 解码 Base64 内容 + * + * @param base64Content Base64 编码的内容 + * @return 解码后的字节数组 + */ + private byte[] decodeBase64Content(String base64Content) { + try { + // 移除可能存在的 Base64 数据 URL 前缀 (例如: data:image/png;base64,) + String actualBase64 = base64Content; + if (base64Content.contains(",")) { + actualBase64 = base64Content.substring(base64Content.indexOf(",") + 1); + } + return Base64.getDecoder().decode(actualBase64); + } catch (IllegalArgumentException e) { + throw exception(FILE_IS_EMPTY); + } + } + private FileDO uploadFile(byte[] content, String name, String directory, String type, Boolean encrypt) throws Exception { String aesIvBase64 = null;