@hzab/utils 1.1.1 → 1.1.3
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/changelog.md +8 -54
- package/package.json +1 -1
- package/src/array.ts +8 -8
- package/src/base64Str.ts +49 -49
- package/src/blob.ts +42 -42
- package/src/color.ts +302 -302
- package/src/empty-val.ts +40 -40
- package/src/file/file.ts +37 -37
- package/src/file/fileName.ts +98 -98
- package/src/formily/cloneSchema.ts +63 -63
- package/src/formily/global-components.ts +48 -48
- package/src/formily/schema-merge.ts +68 -68
- package/src/locationUtils.ts +26 -26
- package/src/options.ts +226 -226
- package/src/string.ts +31 -31
- package/src/upload/OfflineUpload.ts +342 -341
- package/src/upload/fileDataNormalization.ts +281 -281
- package/src/upload/ossUpload.ts +23 -22
- package/src/upload/uploadUtils.ts +112 -42
package/changelog.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
# @hzab/utils@1.1.3
|
|
2
|
+
|
|
3
|
+
feat: 增强 mergePreviewConfig——仅在有有效前缀时拼接;支持 data/blob/协议相对地址;兼容 baseUrl 别名
|
|
4
|
+
|
|
5
|
+
# @hzab/utils@1.1.2
|
|
6
|
+
|
|
7
|
+
fix: opt?.params?.hasPrePath 支持关闭内部默认地址前缀
|
|
8
|
+
|
|
1
9
|
# @hzab/utils@1.1.1
|
|
2
10
|
|
|
3
11
|
fix: fileName 添加 hash 判断
|
|
@@ -33,57 +41,3 @@ feat: 添加压缩图片函数
|
|
|
33
41
|
# @hzab/utils@1.0.13
|
|
34
42
|
|
|
35
43
|
feat: upload axios ts
|
|
36
|
-
|
|
37
|
-
# @hzab/utils@1.0.12
|
|
38
|
-
|
|
39
|
-
feat: 去除省市区行政校验
|
|
40
|
-
|
|
41
|
-
# @hzab/utils@1.0.11
|
|
42
|
-
|
|
43
|
-
feat: 身份证校验合法性
|
|
44
|
-
|
|
45
|
-
# @hzab/utils@1.0.10
|
|
46
|
-
|
|
47
|
-
feat:缩略图全局配置
|
|
48
|
-
|
|
49
|
-
# @hzab/utils@1.0.9
|
|
50
|
-
|
|
51
|
-
fix:获取文件后缀名
|
|
52
|
-
|
|
53
|
-
# @hzab/utils@1.0.8
|
|
54
|
-
|
|
55
|
-
feat: 添加缩略图地址
|
|
56
|
-
|
|
57
|
-
# @hzab/utils@1.0.7
|
|
58
|
-
|
|
59
|
-
feat: 添加缩略图地址
|
|
60
|
-
feat: formily schema clone fn
|
|
61
|
-
|
|
62
|
-
# @hzab/utils@1.0.6
|
|
63
|
-
|
|
64
|
-
feat: formily global components management
|
|
65
|
-
|
|
66
|
-
# @hzab/utils@1.0.5
|
|
67
|
-
|
|
68
|
-
fix: upload 文件名简化
|
|
69
|
-
|
|
70
|
-
# @hzab/utils@1.0.3
|
|
71
|
-
|
|
72
|
-
feat:公有环境添加缩略图地址
|
|
73
|
-
|
|
74
|
-
# @hzab/utils@1.0.2
|
|
75
|
-
|
|
76
|
-
feat: 选择 20 位的 uuid
|
|
77
|
-
|
|
78
|
-
# @hzab/utils@1.0.1
|
|
79
|
-
|
|
80
|
-
feat: OssUploadUtil
|
|
81
|
-
feat: 新增二维码,创建、获取,区分测试、正式环境
|
|
82
|
-
|
|
83
|
-
# @hzab/utils@1.0.0
|
|
84
|
-
|
|
85
|
-
优化文件上传逻辑
|
|
86
|
-
|
|
87
|
-
# @hzab/utils@0.0.1
|
|
88
|
-
|
|
89
|
-
组件初始化
|
package/package.json
CHANGED
package/src/array.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取数组格式数据
|
|
3
|
-
* @param value
|
|
4
|
-
* @returns
|
|
5
|
-
*/
|
|
6
|
-
export function getArr(value) {
|
|
7
|
-
return Array.isArray(value) ? value : (value && [value]) || [];
|
|
8
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 获取数组格式数据
|
|
3
|
+
* @param value
|
|
4
|
+
* @returns
|
|
5
|
+
*/
|
|
6
|
+
export function getArr(value) {
|
|
7
|
+
return Array.isArray(value) ? value : (value && [value]) || [];
|
|
8
|
+
}
|
package/src/base64Str.ts
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 是否是 base64 字符串
|
|
3
|
-
* @param {*} str
|
|
4
|
-
* @returns
|
|
5
|
-
*/
|
|
6
|
-
export const isBase64Str = function (str) {
|
|
7
|
-
if (typeof str !== "string") {
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
return /^data:\w+\/\w+;base64/i.test(str);
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* 从 base64 字符串获取文件类型
|
|
15
|
-
* @param base64Str
|
|
16
|
-
* @returns
|
|
17
|
-
*/
|
|
18
|
-
export function getFileTypeFromBase64(base64Str) {
|
|
19
|
-
if (!isBase64Str(base64Str)) {
|
|
20
|
-
return base64Str;
|
|
21
|
-
}
|
|
22
|
-
// 移除Base64前缀(如果存在)
|
|
23
|
-
const base64Data = base64Str.replace(/^data:.*;base64,/, "");
|
|
24
|
-
|
|
25
|
-
// 键值对调换:Base64前缀作为键,文件类型信息作为值
|
|
26
|
-
const prefixMap = {
|
|
27
|
-
JVBERi0: { type: "pdf", mimeType: "application/pdf" },
|
|
28
|
-
R0lGODdh: { type: "gif", mimeType: "image/gif" },
|
|
29
|
-
R0lGODlh: { type: "gif", mimeType: "image/gif" },
|
|
30
|
-
iVBORw0KGgo: { type: "png", mimeType: "image/png" },
|
|
31
|
-
"/9j/": { type: "jpeg", mimeType: "image/jpeg" },
|
|
32
|
-
SUQzB: { type: "mp4", mimeType: "video/mp4" },
|
|
33
|
-
AAAAGGZ0eXBpc29tAA: { type: "mpeg", mimeType: "audio/mpeg" },
|
|
34
|
-
UklGR: { type: "webp", mimeType: "image/webp" },
|
|
35
|
-
PD94bWwgdmVyc2lvbj0: { type: "xml", mimeType: "text/xml" },
|
|
36
|
-
PHN2ZyB4bWxucz0: { type: "svg", mimeType: "image/svg+xml" },
|
|
37
|
-
dGV4dCB4bWxucz0: { type: "txt", mimeType: "text/plain" },
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// 使用Object.keys遍历所有前缀,一次循环完成检测
|
|
41
|
-
for (const prefix of Object.keys(prefixMap)) {
|
|
42
|
-
if (base64Data.startsWith(prefix)) {
|
|
43
|
-
return prefixMap[prefix];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// 未匹配到已知类型
|
|
48
|
-
return { type: "unknown", mimeType: "application/octet-stream" };
|
|
49
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 是否是 base64 字符串
|
|
3
|
+
* @param {*} str
|
|
4
|
+
* @returns
|
|
5
|
+
*/
|
|
6
|
+
export const isBase64Str = function (str) {
|
|
7
|
+
if (typeof str !== "string") {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return /^data:\w+\/\w+;base64/i.test(str);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 从 base64 字符串获取文件类型
|
|
15
|
+
* @param base64Str
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
export function getFileTypeFromBase64(base64Str) {
|
|
19
|
+
if (!isBase64Str(base64Str)) {
|
|
20
|
+
return base64Str;
|
|
21
|
+
}
|
|
22
|
+
// 移除Base64前缀(如果存在)
|
|
23
|
+
const base64Data = base64Str.replace(/^data:.*;base64,/, "");
|
|
24
|
+
|
|
25
|
+
// 键值对调换:Base64前缀作为键,文件类型信息作为值
|
|
26
|
+
const prefixMap = {
|
|
27
|
+
JVBERi0: { type: "pdf", mimeType: "application/pdf" },
|
|
28
|
+
R0lGODdh: { type: "gif", mimeType: "image/gif" },
|
|
29
|
+
R0lGODlh: { type: "gif", mimeType: "image/gif" },
|
|
30
|
+
iVBORw0KGgo: { type: "png", mimeType: "image/png" },
|
|
31
|
+
"/9j/": { type: "jpeg", mimeType: "image/jpeg" },
|
|
32
|
+
SUQzB: { type: "mp4", mimeType: "video/mp4" },
|
|
33
|
+
AAAAGGZ0eXBpc29tAA: { type: "mpeg", mimeType: "audio/mpeg" },
|
|
34
|
+
UklGR: { type: "webp", mimeType: "image/webp" },
|
|
35
|
+
PD94bWwgdmVyc2lvbj0: { type: "xml", mimeType: "text/xml" },
|
|
36
|
+
PHN2ZyB4bWxucz0: { type: "svg", mimeType: "image/svg+xml" },
|
|
37
|
+
dGV4dCB4bWxucz0: { type: "txt", mimeType: "text/plain" },
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// 使用Object.keys遍历所有前缀,一次循环完成检测
|
|
41
|
+
for (const prefix of Object.keys(prefixMap)) {
|
|
42
|
+
if (base64Data.startsWith(prefix)) {
|
|
43
|
+
return prefixMap[prefix];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 未匹配到已知类型
|
|
48
|
+
return { type: "unknown", mimeType: "application/octet-stream" };
|
|
49
|
+
}
|
package/src/blob.ts
CHANGED
|
@@ -1,42 +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
|
-
}
|
|
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
|
+
}
|