@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 +1 -1
- package/src/blob.ts +42 -0
- package/src/file/fileName.ts +1 -0
- package/src/upload/uploadUtils.ts +41 -3
package/package.json
CHANGED
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
|
+
}
|
package/src/file/fileName.ts
CHANGED
|
@@ -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
|
-
|
|
65
|
-
const
|
|
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
|
-
|
|
110
|
+
const nm = mergeFileName(_fileName + "." + type, `~kid-${hashStr}${objStr}`);
|
|
111
|
+
|
|
112
|
+
return nm
|
|
75
113
|
};
|
|
76
114
|
|
|
77
115
|
/**
|