Commit 2621f2195d1bacfbc56d143ff827bd1d717e6a8d

Authored by jiangqiang
1 parent dd726f79

优化代码

yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/FileUtils.java
1 package cn.iocoder.yudao.framework.common.util.io; 1 package cn.iocoder.yudao.framework.common.util.io;
2 2
  3 +import cn.hutool.core.io.FileTypeUtil;
3 import cn.hutool.core.io.FileUtil; 4 import cn.hutool.core.io.FileUtil;
  5 +import cn.hutool.core.io.file.FileNameUtil;
4 import cn.hutool.core.util.IdUtil; 6 import cn.hutool.core.util.IdUtil;
  7 +import cn.hutool.core.util.StrUtil;
  8 +import cn.hutool.crypto.digest.DigestUtil;
5 import lombok.SneakyThrows; 9 import lombok.SneakyThrows;
6 10
  11 +import java.io.ByteArrayInputStream;
7 import java.io.File; 12 import java.io.File;
8 13
9 /** 14 /**
@@ -58,8 +63,20 @@ public class FileUtils { @@ -58,8 +63,20 @@ public class FileUtils {
58 return file; 63 return file;
59 } 64 }
60 65
61 -  
62 - public static void main(String[] args) { 66 + /**
  67 + * @param content 文件内容
  68 + * @param originalName 原始文件名
  69 + * @return path,唯一不可重复
  70 + */
  71 + public static String generatePath(byte[] content, String originalName) {
  72 + String sha256Hex = DigestUtil.sha256Hex(content);
  73 + // 如果存在name,则优先使用name的后缀
  74 + if (StrUtil.isNotBlank(originalName)) {
  75 + String extName = FileNameUtil.extName(originalName);
  76 + return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName;
  77 + } else {
  78 + return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content));
  79 + }
63 } 80 }
64 81
65 } 82 }
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 { @@ -16,7 +16,7 @@ public class FileTypeUtils {
16 /** 16 /**
17 * 获得文件的 mineType,对于doc,jar等文件会有误差 17 * 获得文件的 mineType,对于doc,jar等文件会有误差
18 * 18 *
19 - * @param data 包含文件开头几千个字节的字节数组 19 + * @param data 文件内容
20 * @return mineType 无法识别时会返回“application/octet-stream” 20 * @return mineType 无法识别时会返回“application/octet-stream”
21 */ 21 */
22 @SneakyThrows 22 @SneakyThrows
@@ -37,7 +37,7 @@ public class FileTypeUtils { @@ -37,7 +37,7 @@ public class FileTypeUtils {
37 /** 37 /**
38 * 在拥有文件和数据的情况下,最好使用此方法,最为准确 38 * 在拥有文件和数据的情况下,最好使用此方法,最为准确
39 * 39 *
40 - * @param data 包含文件开头几千个字节的字节数组 40 + * @param data 文件内容
41 * @param name 文件名 41 * @param name 文件名
42 * @return mineType 无法识别时会返回“application/octet-stream” 42 * @return mineType 无法识别时会返回“application/octet-stream”
43 */ 43 */
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java
1 package cn.iocoder.yudao.module.infra.service.file; 1 package cn.iocoder.yudao.module.infra.service.file;
2 2
3 -import cn.hutool.core.io.FileTypeUtil;  
4 -import cn.hutool.core.io.file.FileNameUtil; 3 +import cn.hutool.core.io.FileUtil;
5 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
6 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
7 -import cn.hutool.crypto.digest.DigestUtil;  
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.io.FileUtils;
9 import cn.iocoder.yudao.framework.file.core.client.FileClient; 8 import cn.iocoder.yudao.framework.file.core.client.FileClient;
10 import cn.iocoder.yudao.framework.file.core.utils.FileTypeUtils; 9 import cn.iocoder.yudao.framework.file.core.utils.FileTypeUtils;
11 import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO; 10 import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO;
@@ -15,7 +14,6 @@ import lombok.SneakyThrows; @@ -15,7 +14,6 @@ import lombok.SneakyThrows;
15 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
16 15
17 import javax.annotation.Resource; 16 import javax.annotation.Resource;
18 -import java.io.ByteArrayInputStream;  
19 17
20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 18 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; 19 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS;
@@ -45,14 +43,7 @@ public class FileServiceImpl implements FileService { @@ -45,14 +43,7 @@ public class FileServiceImpl implements FileService {
45 // 计算默认的 path 名 43 // 计算默认的 path 名
46 String type = FileTypeUtils.getMineType(content, name); 44 String type = FileTypeUtils.getMineType(content, name);
47 if (StrUtil.isEmpty(path)) { 45 if (StrUtil.isEmpty(path)) {
48 - String sha256Hex = DigestUtil.sha256Hex(content);  
49 - /* 如果存在name,则优先使用name的后缀 */  
50 - if (StrUtil.isNotBlank(name)) {  
51 - String extName = FileNameUtil.extName(name);  
52 - path = StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName;  
53 - } else {  
54 - path = sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content), name);  
55 - } 46 + path = FileUtils.generatePath(content, name);
56 } 47 }
57 // 如果 name 为空,则使用 path 填充 48 // 如果 name 为空,则使用 path 填充
58 if (StrUtil.isEmpty(name)) { 49 if (StrUtil.isEmpty(name)) {
yudao-ui-admin/src/views/infra/file/index.vue
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 :width="'100px'"></image-preview> 37 :width="'100px'"></image-preview>
38 <i v-else>无法预览,点击 38 <i v-else>无法预览,点击
39 <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" 39 <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
40 - :href="getFileUrl+scope.row.configId+'/get/' + scope.row.path">下载 40 + :href="getFileUrl + scope.row.configId + '/get/' + scope.row.path">下载
41 </el-link> 41 </el-link>
42 </i> 42 </i>
43 </template> 43 </template>