From 2621f2195d1bacfbc56d143ff827bd1d717e6a8d Mon Sep 17 00:00:00 2001 From: jiangqiang Date: Sat, 9 Jul 2022 17:46:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/util/io/FileUtils.java | 21 +++++++++++++++++-- .../file/core/utils/FileTypeUtils.java | 4 ++-- .../infra/service/file/FileServiceImpl.java | 15 +++---------- yudao-ui-admin/src/views/infra/file/index.vue | 2 +- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/FileUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/FileUtils.java index 89fab2da2..f6cb2c82d 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/FileUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/FileUtils.java @@ -1,9 +1,14 @@ package cn.iocoder.yudao.framework.common.util.io; +import cn.hutool.core.io.FileTypeUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; import lombok.SneakyThrows; +import java.io.ByteArrayInputStream; import java.io.File; /** @@ -58,8 +63,20 @@ public class FileUtils { return file; } - - public static void main(String[] args) { + /** + * @param content 文件内容 + * @param originalName 原始文件名 + * @return path,唯一不可重复 + */ + public static String generatePath(byte[] content, String originalName) { + String sha256Hex = DigestUtil.sha256Hex(content); + // 如果存在name,则优先使用name的后缀 + if (StrUtil.isNotBlank(originalName)) { + String extName = FileNameUtil.extName(originalName); + return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName; + } else { + return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content)); + } } } diff --git a/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/utils/FileTypeUtils.java b/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/utils/FileTypeUtils.java index b623d364a..8b99227b1 100644 --- a/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/utils/FileTypeUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/utils/FileTypeUtils.java @@ -16,7 +16,7 @@ public class FileTypeUtils { /** * 获得文件的 mineType,对于doc,jar等文件会有误差 * - * @param data 包含文件开头几千个字节的字节数组 + * @param data 文件内容 * @return mineType 无法识别时会返回“application/octet-stream” */ @SneakyThrows @@ -37,7 +37,7 @@ public class FileTypeUtils { /** * 在拥有文件和数据的情况下,最好使用此方法,最为准确 * - * @param data 包含文件开头几千个字节的字节数组 + * @param data 文件内容 * @param name 文件名 * @return mineType 无法识别时会返回“application/octet-stream” */ diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java index f4aac3014..c69eddfa4 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java @@ -1,11 +1,10 @@ package cn.iocoder.yudao.module.infra.service.file; -import cn.hutool.core.io.FileTypeUtil; -import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.digest.DigestUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.io.FileUtils; import cn.iocoder.yudao.framework.file.core.client.FileClient; import cn.iocoder.yudao.framework.file.core.utils.FileTypeUtils; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO; @@ -15,7 +14,6 @@ import lombok.SneakyThrows; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.io.ByteArrayInputStream; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; @@ -45,14 +43,7 @@ public class FileServiceImpl implements FileService { // 计算默认的 path 名 String type = FileTypeUtils.getMineType(content, name); if (StrUtil.isEmpty(path)) { - String sha256Hex = DigestUtil.sha256Hex(content); - /* 如果存在name,则优先使用name的后缀 */ - if (StrUtil.isNotBlank(name)) { - String extName = FileNameUtil.extName(name); - path = StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName; - } else { - path = sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content), name); - } + path = FileUtils.generatePath(content, name); } // 如果 name 为空,则使用 path 填充 if (StrUtil.isEmpty(name)) { diff --git a/yudao-ui-admin/src/views/infra/file/index.vue b/yudao-ui-admin/src/views/infra/file/index.vue index 5f5c53b46..02de6410c 100644 --- a/yudao-ui-admin/src/views/infra/file/index.vue +++ b/yudao-ui-admin/src/views/infra/file/index.vue @@ -37,7 +37,7 @@ :width="'100px'"> 无法预览,点击 下载 + :href="getFileUrl + scope.row.configId + '/get/' + scope.row.path">下载