From 8b0039ef6e494ac8b29bd15dd48acfacd67a74e6 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 22 Oct 2025 13:52:35 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=87=E4=BB=B6=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=96=B0=E5=A2=9Efeign=E6=8E=A5=E5=8F=A3=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=BF=94=E5=9B=9Eid=EF=BC=9B2=E3=80=81?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=9C=8D=E5=8A=A1=E6=96=B0=E5=A2=9E=E6=A0=B9?= =?UTF-8?q?=E6=8D=AEid=E8=8E=B7=E5=8F=96=E6=96=87=E4=BB=B6=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imes/module/infra/api/file/FileApi.java | 14 ++++++ .../module/infra/api/file/FileApiImpl.java | 5 +++ .../controller/admin/file/FileController.java | 16 +++++++ .../infra/service/file/FileService.java | 19 ++++++++ .../infra/service/file/FileServiceImpl.java | 43 +++++++++++++++++++ 5 files changed, 97 insertions(+) diff --git a/cf-module-infra/cf-module-infra-api/src/main/java/com/cf/imes/module/infra/api/file/FileApi.java b/cf-module-infra/cf-module-infra-api/src/main/java/com/cf/imes/module/infra/api/file/FileApi.java index 9987d8a1f..8c498d211 100644 --- a/cf-module-infra/cf-module-infra-api/src/main/java/com/cf/imes/module/infra/api/file/FileApi.java +++ b/cf-module-infra/cf-module-infra-api/src/main/java/com/cf/imes/module/infra/api/file/FileApi.java @@ -75,4 +75,18 @@ public interface FileApi { @Parameter(name = "path", description = "文件地址", example = "url", required = true) CommonResult deleteFileByPath(String path); + @PostMapping(PREFIX + "/create/id") + @Operation(summary = "保存文件,并返回文件id") + CommonResult createFileAndReturnId(@Valid @RequestBody FileCreateReqDTO createReqDTO); + + /** + * 保存文件,并返回文件id + * + * @param content 文件内容 + * @param fileName 文件名称 + * @return 文件路径 + */ + default Long createFileAndReturnId(byte[] content, String fileName) { + return createFileAndReturnId(new FileCreateReqDTO().setName(fileName).setPath(null).setContent(content)).getCheckedData(); + } } diff --git a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/api/file/FileApiImpl.java b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/api/file/FileApiImpl.java index 14135c36e..0b3473371 100644 --- a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/api/file/FileApiImpl.java +++ b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/api/file/FileApiImpl.java @@ -28,4 +28,9 @@ public class FileApiImpl implements FileApi { return success(fileService.deleteFileByPath(path)); } + @Override + public CommonResult createFileAndReturnId(FileCreateReqDTO createReqDTO) { + return success(fileService.createFileDO(createReqDTO.getName(), createReqDTO.getPath(), + createReqDTO.getContent())); + } } diff --git a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/controller/admin/file/FileController.java b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/controller/admin/file/FileController.java index 425483c7a..66ee7f0d2 100644 --- a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/controller/admin/file/FileController.java +++ b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/controller/admin/file/FileController.java @@ -85,6 +85,22 @@ public class FileController { ServletUtils.writeAttachment(response, path, content); } + @GetMapping("/{id}") + @Operation(summary = "根据文件编号下载文件") + @Parameter(name = "id", description = "文件编号", required = true) + @OperateLog(enable = false) + public void getFileContentById(HttpServletRequest request, + HttpServletResponse response, + @PathVariable("id") Long id) throws Exception { + byte[] content = fileService.getFileById(id); + if (content == null) { + log.warn("[getFileContent][id({}) 文件不存在]", id); + response.setStatus(HttpStatus.NOT_FOUND.value()); + return; + } + ServletUtils.writeAttachment(response, String.valueOf(id), content); + } + @GetMapping("/page") @Operation(summary = "获得文件分页") @PreAuthorize("@ss.hasPermission('infra:file:query')") diff --git a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileService.java b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileService.java index 22403e3d2..c251f2d97 100644 --- a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileService.java +++ b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileService.java @@ -29,6 +29,16 @@ public interface FileService { */ String createFile(String name, String path, byte[] content); + /** + * 保存文件,并返回文件id + * + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + Long createFileDO(String name, String path, byte[] content); + /** * 删除文件 * @@ -45,6 +55,15 @@ public interface FileService { */ byte[] getFileContent(Long configId, String path) throws Exception; + /** + * 通过文件id获取文件内容 + * + * @param id + * @return + * @throws Exception + */ + byte[] getFileById(Long id) throws Exception; + /** * 删除文件 * @param path 文件地址 diff --git a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileServiceImpl.java b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileServiceImpl.java index 0d6e5c10c..2cf23365b 100644 --- a/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileServiceImpl.java +++ b/cf-module-infra/cf-module-infra-biz/src/main/java/com/cf/imes/module/infra/service/file/FileServiceImpl.java @@ -3,6 +3,7 @@ package com.cf.imes.module.infra.service.file; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.CharSequenceUtil; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.Assert.AssertUtils; import com.cf.imes.framework.common.util.io.FileUtils; import com.cf.imes.module.infra.framework.file.core.client.FileClient; import com.cf.imes.module.infra.framework.file.core.utils.FileTypeUtils; @@ -72,6 +73,36 @@ public class FileServiceImpl implements FileService { return url; } + @Override + @SneakyThrows + public Long createFileDO(String name, String path, byte[] content) { + // 计算默认的 path 名 + String type = FileTypeUtils.getMineType(content, name); + if (CharSequenceUtil.isEmpty(path)) { + path = FileUtils.generatePath(content, name); + } + // 如果 name 为空,则使用 path 填充 + if (CharSequenceUtil.isEmpty(name)) { + name = path; + } + + // 上传到文件存储器 + FileClient client = fileConfigService.getMasterFileClient(); + Assert.notNull(client, "客户端(master) 不能为空"); + String url = client.upload(content, path, type); + + // 保存到数据库 + FileDO file = new FileDO(); + file.setConfigId(client.getId()); + file.setName(name); + file.setPath(path); + file.setUrl(url); + file.setType(type); + file.setSize(content.length); + fileMapper.insert(file); + return file.getId(); + } + @Override public void deleteFile(Long id) throws Exception { // 校验存在 @@ -101,6 +132,18 @@ public class FileServiceImpl implements FileService { return client.getContent(path); } + @Override + public byte[] getFileById(Long id) throws Exception { + FileDO fileDO = fileMapper.selectById(id); + AssertUtils.notEmpty(fileDO, FILE_NOT_EXISTS); + + Long configId = fileDO.getConfigId(); + FileClient client = fileConfigService.getFileClient(configId); + Assert.notNull(client, CLIENT_ERR_NOTIFICATION, configId); + + return client.getContent(fileDO.getPath()); + } + @Override public Boolean deleteFileByPath(String path) { // 校验存在