@hzab/utils 1.0.17 → 1.0.18
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 +4 -0
- package/package.json +1 -1
- package/src/upload/uploadUtils.ts +164 -164
package/changelog.md
CHANGED
package/package.json
CHANGED
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
import dayjs from "dayjs";
|
|
2
|
-
|
|
3
|
-
import { getArr } from "../array";
|
|
4
|
-
import { isBase64Str } from "../base64Str";
|
|
5
|
-
|
|
6
|
-
import { mergeFileName, getFileName, getFileNameExt } from "../file/fileName";
|
|
7
|
-
import { getFileTypeExt } from "../file/fileType";
|
|
8
|
-
import { nanoidNumALetters } from "../nanoid";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 格式化 dir 字符串,必须为非 / 开头, / 结尾。如: test/
|
|
12
|
-
* @param {*} dir
|
|
13
|
-
* @returns
|
|
14
|
-
*/
|
|
15
|
-
export const formatDirStr = function (dir) {
|
|
16
|
-
return dir?.replace(/^\/(.*)\/*$/, "$1").replace(/(.?=*)\/*$/, "$1/");
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* 合并 dir 字符串
|
|
21
|
-
* @param {*} dir
|
|
22
|
-
*/
|
|
23
|
-
export const mergeDirStr = function (dir1, dir2) {
|
|
24
|
-
return `${formatDirStr(dir1 || "")}${formatDirStr(dir2 || "")}`;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* 限制文件数量
|
|
29
|
-
* @param fileList
|
|
30
|
-
* @param maxCount
|
|
31
|
-
* @returns
|
|
32
|
-
*/
|
|
33
|
-
export function handleMaxCount(fileList, maxCount) {
|
|
34
|
-
let list = getArr(fileList);
|
|
35
|
-
if (maxCount > 0 && list.length > maxCount) {
|
|
36
|
-
list = list.slice(0, maxCount);
|
|
37
|
-
}
|
|
38
|
-
return list;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* 获取预览 url
|
|
43
|
-
* @param {*} uri
|
|
44
|
-
* @param {*} previewConfig
|
|
45
|
-
* @returns
|
|
46
|
-
*/
|
|
47
|
-
export function getPreviewUrl(uri, previewConfig) {
|
|
48
|
-
const isUriPattern = /http[s]?:\/\/[^\s]+/.test(uri);
|
|
49
|
-
const query = previewConfig?.query ? "?" + previewConfig?.query : "";
|
|
50
|
-
|
|
51
|
-
if (isUriPattern) return `${uri}${query}`?.trim();
|
|
52
|
-
|
|
53
|
-
if (previewConfig) return `${previewConfig?.url}/${uri}${query}`?.trim();
|
|
54
|
-
|
|
55
|
-
return uri;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* 根据 file 对象获取文件名称,文件名称包含:初始名称、类型
|
|
60
|
-
* 数据存储格式 ~k[key]-[data]~ 如: ~ktime-1743649562530~
|
|
61
|
-
* key、data 中的 ~ 转为 _
|
|
62
|
-
* @param file
|
|
63
|
-
*/
|
|
64
|
-
export const getFileNameByFileObj = (file, opt: any) => {
|
|
65
|
-
const {
|
|
66
|
-
useHashName = true,
|
|
67
|
-
params: { fileName = "" } = {}, // 给 params 加默认空对象
|
|
68
|
-
} = opt || {};
|
|
69
|
-
|
|
70
|
-
const _fullFileName = file.name || fileName || "";
|
|
71
|
-
const { mainPart, ext } = getFileNameExt(_fullFileName);
|
|
72
|
-
|
|
73
|
-
console.log("getFileTypeExt(file.type)", file.type, getFileTypeExt(file.type));
|
|
74
|
-
|
|
75
|
-
const _fileName = mainPart || _fullFileName || getFileName(file.url) || "file";
|
|
76
|
-
const _ext = ext || getFileTypeExt(file.type);
|
|
77
|
-
|
|
78
|
-
if (_fileName.indexOf("~kid-") >= 0) {
|
|
79
|
-
return _fileName;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const hashStr = useHashName ? nanoidNumALetters() : "";
|
|
83
|
-
const nm = mergeFileName(_fileName + "." + _ext, `~kid-${hashStr}-${file.createTime || dayjs().valueOf()}-${ext}`);
|
|
84
|
-
|
|
85
|
-
return nm;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* 解析
|
|
90
|
-
* @param url
|
|
91
|
-
* @returns
|
|
92
|
-
*/
|
|
93
|
-
export const getFileNameObj = function (url): any {
|
|
94
|
-
const list = url.match(/~k([^-~]+)-([^~]*)~/g);
|
|
95
|
-
const res = {};
|
|
96
|
-
list?.forEach((it) => {
|
|
97
|
-
const arr = it?.match(/~k([^-~]+)-([^~]*)~/);
|
|
98
|
-
if (arr?.length >= 3) {
|
|
99
|
-
res[arr[1]] = arr[2];
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
return res;
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* 解析
|
|
107
|
-
* @param url
|
|
108
|
-
* @returns
|
|
109
|
-
*/
|
|
110
|
-
export function setFileNameObj(obj) {
|
|
111
|
-
return Object.keys(obj)
|
|
112
|
-
.map((key) => {
|
|
113
|
-
return `~k${key?.replace(/~/g, "_")}-${obj[key]?.toString()?.replace(/~/g, "_")}~`;
|
|
114
|
-
})
|
|
115
|
-
.join("");
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* 通过 key 获取对应的值
|
|
120
|
-
* @param url
|
|
121
|
-
* @param key
|
|
122
|
-
* @returns
|
|
123
|
-
*/
|
|
124
|
-
export const getValByKey = function (url, key) {
|
|
125
|
-
const reg = new RegExp(`~k${key?.replace(/~/g, "_")}-\([^~]*\)~`);
|
|
126
|
-
return url.match(reg)?.[1];
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* 预览 url 添加前缀
|
|
131
|
-
* @param {*} uri
|
|
132
|
-
* @param {*} conf
|
|
133
|
-
* @returns
|
|
134
|
-
*/
|
|
135
|
-
export function mergePreviewConfig(uri, conf) {
|
|
136
|
-
let _uri = uri;
|
|
137
|
-
let basePath = "";
|
|
138
|
-
if (typeof _uri === "object") {
|
|
139
|
-
basePath = _uri.basePath;
|
|
140
|
-
_uri = _uri.previewUrl || _uri.url;
|
|
141
|
-
}
|
|
142
|
-
if (typeof _uri !== "string") {
|
|
143
|
-
return _uri;
|
|
144
|
-
}
|
|
145
|
-
_uri = _uri?.trim();
|
|
146
|
-
// base64 直接返回
|
|
147
|
-
if (isBase64Str(_uri)) {
|
|
148
|
-
return _uri;
|
|
149
|
-
}
|
|
150
|
-
const isUriPattern = /http[s]?:\/\/[^\s]+/.test(_uri);
|
|
151
|
-
const query = conf?.query?.trim() ? "?" + conf?.query?.trim() : "";
|
|
152
|
-
|
|
153
|
-
if (isUriPattern) {
|
|
154
|
-
// 源地址为 http 地址,直接拼接 query 参数
|
|
155
|
-
return `${_uri}${query}`;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (conf) {
|
|
159
|
-
// 拼接前缀
|
|
160
|
-
return `${conf?.url?.trim()?.replace(/\/$/, "")}/${_uri?.trim()?.replace(/^\//, "")}${query}`?.trim();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return _uri;
|
|
164
|
-
}
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
|
|
3
|
+
import { getArr } from "../array";
|
|
4
|
+
import { isBase64Str } from "../base64Str";
|
|
5
|
+
|
|
6
|
+
import { mergeFileName, getFileName, getFileNameExt } from "../file/fileName";
|
|
7
|
+
import { getFileTypeExt } from "../file/fileType";
|
|
8
|
+
import { nanoidNumALetters } from "../nanoid";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 格式化 dir 字符串,必须为非 / 开头, / 结尾。如: test/
|
|
12
|
+
* @param {*} dir
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
export const formatDirStr = function (dir) {
|
|
16
|
+
return dir?.replace(/^\/(.*)\/*$/, "$1").replace(/(.?=*)\/*$/, "$1/");
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 合并 dir 字符串
|
|
21
|
+
* @param {*} dir
|
|
22
|
+
*/
|
|
23
|
+
export const mergeDirStr = function (dir1, dir2) {
|
|
24
|
+
return `${formatDirStr(dir1 || "")}${formatDirStr(dir2 || "")}`;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 限制文件数量
|
|
29
|
+
* @param fileList
|
|
30
|
+
* @param maxCount
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
33
|
+
export function handleMaxCount(fileList, maxCount) {
|
|
34
|
+
let list = getArr(fileList);
|
|
35
|
+
if (maxCount > 0 && list.length > maxCount) {
|
|
36
|
+
list = list.slice(0, maxCount);
|
|
37
|
+
}
|
|
38
|
+
return list;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 获取预览 url
|
|
43
|
+
* @param {*} uri
|
|
44
|
+
* @param {*} previewConfig
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
export function getPreviewUrl(uri, previewConfig) {
|
|
48
|
+
const isUriPattern = /http[s]?:\/\/[^\s]+/.test(uri);
|
|
49
|
+
const query = previewConfig?.query ? "?" + previewConfig?.query : "";
|
|
50
|
+
|
|
51
|
+
if (isUriPattern) return `${uri}${query}`?.trim();
|
|
52
|
+
|
|
53
|
+
if (previewConfig) return `${previewConfig?.url}/${uri}${query}`?.trim();
|
|
54
|
+
|
|
55
|
+
return uri;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 根据 file 对象获取文件名称,文件名称包含:初始名称、类型
|
|
60
|
+
* 数据存储格式 ~k[key]-[data]~ 如: ~ktime-1743649562530~
|
|
61
|
+
* key、data 中的 ~ 转为 _
|
|
62
|
+
* @param file
|
|
63
|
+
*/
|
|
64
|
+
export const getFileNameByFileObj = (file, opt: any) => {
|
|
65
|
+
const {
|
|
66
|
+
useHashName = true,
|
|
67
|
+
params: { fileName = "" } = {}, // 给 params 加默认空对象
|
|
68
|
+
} = opt || {};
|
|
69
|
+
|
|
70
|
+
const _fullFileName = file.name || fileName || "";
|
|
71
|
+
const { mainPart, ext } = getFileNameExt(_fullFileName);
|
|
72
|
+
|
|
73
|
+
console.log("getFileTypeExt(file.type)", file.type, getFileTypeExt(file.type));
|
|
74
|
+
|
|
75
|
+
const _fileName = mainPart || _fullFileName || getFileName(file.url) || "file";
|
|
76
|
+
const _ext = ext || getFileTypeExt(file.type);
|
|
77
|
+
|
|
78
|
+
if (_fileName.indexOf("~kid-") >= 0) {
|
|
79
|
+
return _fileName;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const hashStr = useHashName ? nanoidNumALetters() : "";
|
|
83
|
+
const nm = mergeFileName(_fileName + "." + _ext, (_fileName.indexOf("~kid-") ? "" : `~kid-${hashStr}-${file.createTime || dayjs().valueOf()}-${ext}`));
|
|
84
|
+
|
|
85
|
+
return nm;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 解析
|
|
90
|
+
* @param url
|
|
91
|
+
* @returns
|
|
92
|
+
*/
|
|
93
|
+
export const getFileNameObj = function (url): any {
|
|
94
|
+
const list = url.match(/~k([^-~]+)-([^~]*)~/g);
|
|
95
|
+
const res = {};
|
|
96
|
+
list?.forEach((it) => {
|
|
97
|
+
const arr = it?.match(/~k([^-~]+)-([^~]*)~/);
|
|
98
|
+
if (arr?.length >= 3) {
|
|
99
|
+
res[arr[1]] = arr[2];
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return res;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 解析
|
|
107
|
+
* @param url
|
|
108
|
+
* @returns
|
|
109
|
+
*/
|
|
110
|
+
export function setFileNameObj(obj) {
|
|
111
|
+
return Object.keys(obj)
|
|
112
|
+
.map((key) => {
|
|
113
|
+
return `~k${key?.replace(/~/g, "_")}-${obj[key]?.toString()?.replace(/~/g, "_")}~`;
|
|
114
|
+
})
|
|
115
|
+
.join("");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 通过 key 获取对应的值
|
|
120
|
+
* @param url
|
|
121
|
+
* @param key
|
|
122
|
+
* @returns
|
|
123
|
+
*/
|
|
124
|
+
export const getValByKey = function (url, key) {
|
|
125
|
+
const reg = new RegExp(`~k${key?.replace(/~/g, "_")}-\([^~]*\)~`);
|
|
126
|
+
return url.match(reg)?.[1];
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 预览 url 添加前缀
|
|
131
|
+
* @param {*} uri
|
|
132
|
+
* @param {*} conf
|
|
133
|
+
* @returns
|
|
134
|
+
*/
|
|
135
|
+
export function mergePreviewConfig(uri, conf) {
|
|
136
|
+
let _uri = uri;
|
|
137
|
+
let basePath = "";
|
|
138
|
+
if (typeof _uri === "object") {
|
|
139
|
+
basePath = _uri.basePath;
|
|
140
|
+
_uri = _uri.previewUrl || _uri.url;
|
|
141
|
+
}
|
|
142
|
+
if (typeof _uri !== "string") {
|
|
143
|
+
return _uri;
|
|
144
|
+
}
|
|
145
|
+
_uri = _uri?.trim();
|
|
146
|
+
// base64 直接返回
|
|
147
|
+
if (isBase64Str(_uri)) {
|
|
148
|
+
return _uri;
|
|
149
|
+
}
|
|
150
|
+
const isUriPattern = /http[s]?:\/\/[^\s]+/.test(_uri);
|
|
151
|
+
const query = conf?.query?.trim() ? "?" + conf?.query?.trim() : "";
|
|
152
|
+
|
|
153
|
+
if (isUriPattern) {
|
|
154
|
+
// 源地址为 http 地址,直接拼接 query 参数
|
|
155
|
+
return `${_uri}${query}`;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (conf) {
|
|
159
|
+
// 拼接前缀
|
|
160
|
+
return `${conf?.url?.trim()?.replace(/\/$/, "")}/${_uri?.trim()?.replace(/^\//, "")}${query}`?.trim();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return _uri;
|
|
164
|
+
}
|