@hzab/utils 0.0.2 → 1.0.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hzab/utils",
3
- "version": "0.0.2",
3
+ "version": "1.0.0-beta",
4
4
  "description": "utils",
5
5
  "main": "src",
6
6
  "scripts": {
package/src/blob.ts ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 通过 Blob 的文件签名判断文件类型
3
+ * @param {Blob} blob - 待检测的 Blob 对象
4
+ * @returns {Promise<string>} - 匹配的 MIME 类型或 'unknown'
5
+ */
6
+ export async function getFileTypeFromBlob(blob: Blob): Promise<string> {
7
+ // 预设文件签名表(键:十六进制前缀,值:MIME类型)
8
+ const fileSignatures = {
9
+ "89504E47": "image/png",
10
+ FFD8FF: "image/jpeg",
11
+ "47494638": "image/gif",
12
+ "25504446": "application/pdf",
13
+ "504B0304": "application/zip", // ZIP 或 DOCX/XLSX 等基于 ZIP 的格式
14
+ "3C3F786D6C": "text/xml", // XML
15
+ "7B22": "application/json", // JSON(开头可能为 { 或 {")
16
+ "25215053": "application/postscript", // PS
17
+ "494433": "audio/mpeg", // MP3
18
+ "0000001866747970": "video/mp4", // MP4(部分情况)
19
+ };
20
+
21
+ // 读取 Blob 的前 8 字节(足够覆盖大部分签名)
22
+ const buffer = await blob.slice(0, 8).arrayBuffer();
23
+ const uint8Array = new Uint8Array(buffer);
24
+
25
+ // 转换为十六进制字符串(大写)
26
+ let hex = "";
27
+ for (let i = 0; i < uint8Array.length; i++) {
28
+ const byte = uint8Array[i].toString(16).padStart(2, "0");
29
+ hex += byte.toUpperCase();
30
+ }
31
+
32
+ // 对比签名表(优先匹配长前缀)
33
+ const signatures = Object.keys(fileSignatures).sort((a, b) => b.length - a.length);
34
+ for (const signature of signatures) {
35
+ if (hex.startsWith(signature)) {
36
+ return fileSignatures[signature];
37
+ }
38
+ }
39
+
40
+ // 未匹配到已知类型
41
+ return "unknown";
42
+ }
@@ -63,6 +63,7 @@ export const mergeFileName = function (fileName, str = "") {
63
63
  }
64
64
  const name = fileName?.match(/([^\/]+?)\.[^\/]+$/)?.[1] || "";
65
65
  const suffix = fileName?.match(/[^\/]+?\.([^\/]+)$/)?.[1] || "";
66
+
66
67
  return `${name}${str ?? ""}.${suffix}`;
67
68
  };
68
69
 
@@ -54,6 +54,30 @@ export function getPreviewUrl(uri, previewConfig) {
54
54
  return uri;
55
55
  }
56
56
 
57
+
58
+ export const getFileNameExt = function (fileName,) {
59
+ const regex = /^(.*)\.([^.]+)$/;
60
+ const result = fileName.match(regex);
61
+ if (result) {
62
+ const [, mainPart, ext] = result;
63
+ return {
64
+ mainPart,
65
+ ext
66
+ }
67
+ }
68
+ return {
69
+ mainPart: fileName,
70
+ ext: ""
71
+ }
72
+ };
73
+
74
+ export const getFileTypeExt = function (type,) {
75
+ if (type.indexOf("/") >= 0) {
76
+ return type?.match(/[^\/]*\/([^\/]+)$/)?.[1]
77
+ };
78
+ return type;
79
+ };
80
+
57
81
  /**
58
82
  * 根据 file 对象获取文件名称,文件名称包含:初始名称、类型
59
83
  * 数据存储格式 ~k[key]-[data]~ 如: ~ktime-1743649562530~
@@ -61,17 +85,31 @@ export function getPreviewUrl(uri, previewConfig) {
61
85
  * @param file
62
86
  */
63
87
  export const getFileNameByFileObj = (file, opt: any) => {
64
- const { useHashName = true } = opt || {};
65
- const _fileName = file.name || getFileName(file.url);
88
+
89
+ const {
90
+ useHashName = true,
91
+ params: { fileName = "" } = {} // 给 params 加默认空对象
92
+ } = opt || {};
93
+
94
+ const { mainPart,
95
+ ext } = getFileNameExt(file.name || "");
96
+
97
+ const type = ext || getFileTypeExt(file.type || file.contentType);
98
+
99
+ const _fileName = fileName || mainPart || getFileName(file.url) || "oss";
100
+
66
101
  if (_fileName.indexOf("~kid-") >= 0) {
67
102
  return _fileName;
68
103
  }
104
+
69
105
  const objStr = setFileNameObj({
70
106
  t: file.createTime || dayjs().valueOf(),
71
107
  ext: file.ext || (file.type || file.contentType)?.replace("/", "_"),
72
108
  });
73
109
  const hashStr = useHashName ? `${nanoidNumALetters()}-` : "";
74
- return mergeFileName(_fileName, `~kid-${hashStr}${objStr}`);
110
+ const nm = mergeFileName(_fileName + "." + type, `~kid-${hashStr}${objStr}`);
111
+
112
+ return nm
75
113
  };
76
114
 
77
115
  /**