@hzab/utils 1.1.2 → 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.
@@ -1,281 +1,281 @@
1
- /**
2
- * 文件数据格式归一化
3
- */
4
- import dayjs from "dayjs";
5
-
6
- import { nanoidNumALetters } from "../nanoid";
7
- import { objStrToObj } from "../string";
8
- import { isBase64Str, getFileTypeFromBase64 } from "../base64Str";
9
- import { getFileURL } from "../file/file";
10
- import { getFileType } from "../file/fileType";
11
- import { getUFileName, getFileName, getFullFileName, getFileExt } from "../file/fileName";
12
- import { getFileNameObj, mergePreviewConfig } from "./uploadUtils";
13
-
14
- /**
15
- * 文件数据格式
16
- */
17
- export interface IFile {
18
- /** 唯一 id */
19
- uid?: string;
20
- /** 唯一 id */
21
- id: string;
22
- /** 文件地址 */
23
- url: string;
24
- /** 存储的文件地址 */
25
- storeUrl: string;
26
- /** 存储的文件名称 */
27
- name?: string;
28
- /** 存储的文件名称 */
29
- filename?: string;
30
- /** 上传的文件名称 */
31
- originalFilename: string;
32
- /** 基础路径 */
33
- basePath?: string;
34
- /** 存储路径 */
35
- path?: string;
36
- /** 文件后缀 */
37
- ext?: string;
38
- /** 文件类型 */
39
- contentType: string;
40
- /** 上传平台 */
41
- platform: string;
42
- /** 文件预览地址 */
43
- previewUrl?: string;
44
- /** 文件缩略图地址 */
45
- thumbnailUrl?: string;
46
- /** 文件类型 */
47
- type: string;
48
- /** 文件大小 */
49
- size: number;
50
- /** 原始 file 文件 */
51
- originFileObj?: File;
52
- /** 文件上传时间 */
53
- createTime?: string;
54
- /** 最后更新时间戳 */
55
- lastModified?: number;
56
- }
57
-
58
- /**
59
- * 数据处理配置项
60
- */
61
- export interface INormalizationOpt {
62
- /** 列表数据模式:数组 | 字符串 */
63
- listMode: "array" | "jsonStr" | "splitStr";
64
- /** 字符串列表数据模式下的分隔符 */
65
- split: string;
66
- /** 子项数据模式: 格式化对象 | file 文件格式 | url 地址 | JSON 序列化字符串 */
67
- itemMode: "object" | "file" | "url" | "jsonStr";
68
- /** 预览配置参数 */
69
- previewConfig?: Object;
70
- /** 设置预览 URL 的回调 */
71
- getPreviewUrl?: (file, opt) => string;
72
- /** 缩略图配置参数 */
73
- thumbnailUrlConf?: Object;
74
- /** 设置缩略图 URL 的回调 */
75
- getThumbnailUrl?: (file, opt) => string;
76
- }
77
-
78
- /** 内部文件格式 */
79
- const fileTpl: IFile = {
80
- uid: "",
81
- id: "",
82
- url: "",
83
- storeUrl: "",
84
- name: "",
85
- filename: "",
86
- originalFilename: "",
87
- basePath: "",
88
- path: "",
89
- ext: "",
90
- type: "",
91
- contentType: "",
92
- previewUrl: undefined,
93
- size: undefined,
94
- platform: undefined,
95
- lastModified: undefined,
96
- createTime: undefined,
97
- originFileObj: undefined,
98
- };
99
-
100
- /**
101
- * 文件数据格式归一化
102
- */
103
- export const normalizationFileObj = (data: IFile, opt: INormalizationOpt) => {
104
- if (!data) {
105
- console.warn("Upload handleInputData 请传入正确的数据");
106
- return data;
107
- }
108
- let file = {
109
- ...fileTpl,
110
- };
111
- // 对象字符串 转为 对象
112
- const _data = objStrToObj(data);
113
- if (isBase64Str(_data)) {
114
- // base64 格式
115
- file.id = nanoidNumALetters();
116
- file.uid = file.id;
117
- file.url = _data;
118
- file.storeUrl = _data;
119
- file.name = file.id;
120
- file.filename = file.name;
121
- file.originalFilename = file.name;
122
- // 根据 base64 数据获取文件类型
123
- const typeObj = getFileTypeFromBase64(_data);
124
- file.type = typeObj.mimeType;
125
- file.ext = typeObj.type;
126
- } else if (typeof _data === "string") {
127
- // url 格式
128
- const obj = getFileNameObj(_data);
129
- file.id = obj?.id;
130
- file.uid = file.id;
131
- file.url = _data;
132
- file.storeUrl = _data;
133
- file.name = getFullFileName(file.url);
134
- file.filename = file.name;
135
- file.originalFilename = getFullFileName(file.url);
136
- file.type = getFileType(file.url);
137
- file.ext = getFileExt(file.url);
138
- } else if (typeof _data === "object") {
139
- const sourceData = _data.originFileObj || _data;
140
- file.id = _data.id || _data.uid;
141
- file.url = sourceData.url || sourceData.ossUrl;
142
- file.storeUrl = file.url;
143
- file.originalFilename = _data.originalFilename || getFullFileName(file.url) || _data.name;
144
- file.name = _data.filename || _data.name || getFullFileName(file.url);
145
- file.filename = file.name;
146
- file.originFileObj = data instanceof File ? data : undefined;
147
- file.lastModified = _data.lastModified;
148
- file.basePath = _data.basePath;
149
- file.path = _data.path;
150
- file.ext = getFileExt(file.url);
151
- file.type = _data.contentType || _data.type;
152
- file.contentType = file.type;
153
- file.size = _data.size;
154
- file.platform = _data.platform;
155
- file.createTime = _data.createTime;
156
- }
157
-
158
- if (!file.id) {
159
- file.id =
160
- file.uid ||
161
- `${
162
- getFileName(file.url || file.name || file.filename) || "rc-upload"
163
- }-${dayjs().valueOf()}-${nanoidNumALetters()}`;
164
- }
165
- if (!file.name) {
166
- file.name = file.id;
167
- }
168
- if (!file.filename) {
169
- file.filename = file.name;
170
- }
171
- if (!file.storeUrl) {
172
- file.storeUrl = file.url;
173
- }
174
-
175
- // 预览地址
176
- if (!file.previewUrl) {
177
- const { getPreviewUrl, previewConfig } = opt || {};
178
- file.previewUrl = getPreviewUrl ? getPreviewUrl(file, opt) : mergePreviewConfig(file, previewConfig);
179
- }
180
- // 缩略图地址
181
- if (!file.thumbnailUrl) {
182
- const { getThumbnailUrl, thumbnailUrlConf } = opt || {};
183
- file.thumbnailUrl = getThumbnailUrl ? getThumbnailUrl(file, opt) : mergePreviewConfig(file, thumbnailUrlConf);
184
- }
185
-
186
- return file;
187
- };
188
-
189
- /**
190
- * 解析传入的文件列表数据
191
- */
192
- export const parseFileList = (fileList, opt: INormalizationOpt) => {
193
- if (!fileList) {
194
- return [];
195
- }
196
-
197
- let _fileList = fileList;
198
- const { listMode, split } = opt || {};
199
-
200
- // splitStr jsonStr 模式下处理字符串
201
- const isStr = typeof _fileList === "string";
202
- if (isStr && listMode === "splitStr") {
203
- // @ts-ignore
204
- _fileList = _fileList?.split(split ?? ", ");
205
- }
206
-
207
- if (isStr && listMode === "jsonStr") {
208
- _fileList = objStrToObj(_fileList);
209
- }
210
-
211
- const isArr = Array.isArray(_fileList);
212
- // 统一成数组格式
213
- if (_fileList !== null && _fileList !== undefined && !isArr) {
214
- _fileList = [_fileList];
215
- }
216
-
217
- if (isArr) {
218
- const arrRes = [];
219
- _fileList.forEach((it) => {
220
- const itRes = normalizationFileObj(it, opt);
221
- itRes && arrRes.push(itRes);
222
- });
223
- return arrRes;
224
- }
225
- return _fileList;
226
- };
227
-
228
- /**
229
- * 出参子项归一化
230
- * 根据配置,将 对象 处理成所需格式
231
- */
232
- export const formatFile = function (file, opt: INormalizationOpt) {
233
- const { itemMode = "object" } = opt || {};
234
- if (itemMode === "file") {
235
- return file?.originFileObj || file;
236
- }
237
- if (itemMode === "object") {
238
- return normalizationFileObj(file, opt);
239
- }
240
- if (itemMode === "jsonStr" && typeof file !== "string") {
241
- const { originFileObj, ...jFile } = normalizationFileObj(file, opt);
242
- return JSON.stringify({ ...jFile });
243
- }
244
- if (itemMode === "url") {
245
- return typeof file === "string" ? file : file.originFileObj?.url || file?.url;
246
- }
247
- return file;
248
- };
249
-
250
- /**
251
- * 出参 fileList 归一化
252
- * 根据配置,将 对象 处理成所需格式
253
- */
254
- export const formatFileList = function (fileList, opt: INormalizationOpt) {
255
- if (!fileList) {
256
- return undefined;
257
- }
258
-
259
- const { listMode, split } = opt || {};
260
-
261
- let _fileList = fileList;
262
- if (_fileList && !Array.isArray(_fileList)) {
263
- _fileList = [fileList];
264
- }
265
-
266
- // 数组
267
- if (listMode === "array") {
268
- return _fileList?.map((it) => formatFile(it, opt));
269
- }
270
- // 序列化后的字符串
271
- if (listMode === "jsonStr") {
272
- return JSON.stringify(_fileList?.map((it) => formatFile(it, opt)));
273
- }
274
- // join 后的字符串
275
- if (listMode === "splitStr") {
276
- return _fileList
277
- ?.map((it) => formatFile(it, opt))
278
- .filter((it) => it)
279
- .join(split ?? ", ");
280
- }
281
- };
1
+ /**
2
+ * 文件数据格式归一化
3
+ */
4
+ import dayjs from "dayjs";
5
+
6
+ import { nanoidNumALetters } from "../nanoid";
7
+ import { objStrToObj } from "../string";
8
+ import { isBase64Str, getFileTypeFromBase64 } from "../base64Str";
9
+ import { getFileURL } from "../file/file";
10
+ import { getFileType } from "../file/fileType";
11
+ import { getUFileName, getFileName, getFullFileName, getFileExt } from "../file/fileName";
12
+ import { getFileNameObj, mergePreviewConfig } from "./uploadUtils";
13
+
14
+ /**
15
+ * 文件数据格式
16
+ */
17
+ export interface IFile {
18
+ /** 唯一 id */
19
+ uid?: string;
20
+ /** 唯一 id */
21
+ id: string;
22
+ /** 文件地址 */
23
+ url: string;
24
+ /** 存储的文件地址 */
25
+ storeUrl: string;
26
+ /** 存储的文件名称 */
27
+ name?: string;
28
+ /** 存储的文件名称 */
29
+ filename?: string;
30
+ /** 上传的文件名称 */
31
+ originalFilename: string;
32
+ /** 基础路径 */
33
+ basePath?: string;
34
+ /** 存储路径 */
35
+ path?: string;
36
+ /** 文件后缀 */
37
+ ext?: string;
38
+ /** 文件类型 */
39
+ contentType: string;
40
+ /** 上传平台 */
41
+ platform: string;
42
+ /** 文件预览地址 */
43
+ previewUrl?: string;
44
+ /** 文件缩略图地址 */
45
+ thumbnailUrl?: string;
46
+ /** 文件类型 */
47
+ type: string;
48
+ /** 文件大小 */
49
+ size: number;
50
+ /** 原始 file 文件 */
51
+ originFileObj?: File;
52
+ /** 文件上传时间 */
53
+ createTime?: string;
54
+ /** 最后更新时间戳 */
55
+ lastModified?: number;
56
+ }
57
+
58
+ /**
59
+ * 数据处理配置项
60
+ */
61
+ export interface INormalizationOpt {
62
+ /** 列表数据模式:数组 | 字符串 */
63
+ listMode: "array" | "jsonStr" | "splitStr";
64
+ /** 字符串列表数据模式下的分隔符 */
65
+ split: string;
66
+ /** 子项数据模式: 格式化对象 | file 文件格式 | url 地址 | JSON 序列化字符串 */
67
+ itemMode: "object" | "file" | "url" | "jsonStr";
68
+ /** 预览配置参数 */
69
+ previewConfig?: Object;
70
+ /** 设置预览 URL 的回调 */
71
+ getPreviewUrl?: (file, opt) => string;
72
+ /** 缩略图配置参数 */
73
+ thumbnailUrlConf?: Object;
74
+ /** 设置缩略图 URL 的回调 */
75
+ getThumbnailUrl?: (file, opt) => string;
76
+ }
77
+
78
+ /** 内部文件格式 */
79
+ const fileTpl: IFile = {
80
+ uid: "",
81
+ id: "",
82
+ url: "",
83
+ storeUrl: "",
84
+ name: "",
85
+ filename: "",
86
+ originalFilename: "",
87
+ basePath: "",
88
+ path: "",
89
+ ext: "",
90
+ type: "",
91
+ contentType: "",
92
+ previewUrl: undefined,
93
+ size: undefined,
94
+ platform: undefined,
95
+ lastModified: undefined,
96
+ createTime: undefined,
97
+ originFileObj: undefined,
98
+ };
99
+
100
+ /**
101
+ * 文件数据格式归一化
102
+ */
103
+ export const normalizationFileObj = (data: IFile, opt: INormalizationOpt) => {
104
+ if (!data) {
105
+ console.warn("Upload handleInputData 请传入正确的数据");
106
+ return data;
107
+ }
108
+ let file = {
109
+ ...fileTpl,
110
+ };
111
+ // 对象字符串 转为 对象
112
+ const _data = objStrToObj(data);
113
+ if (isBase64Str(_data)) {
114
+ // base64 格式
115
+ file.id = nanoidNumALetters();
116
+ file.uid = file.id;
117
+ file.url = _data;
118
+ file.storeUrl = _data;
119
+ file.name = file.id;
120
+ file.filename = file.name;
121
+ file.originalFilename = file.name;
122
+ // 根据 base64 数据获取文件类型
123
+ const typeObj = getFileTypeFromBase64(_data);
124
+ file.type = typeObj.mimeType;
125
+ file.ext = typeObj.type;
126
+ } else if (typeof _data === "string") {
127
+ // url 格式
128
+ const obj = getFileNameObj(_data);
129
+ file.id = obj?.id;
130
+ file.uid = file.id;
131
+ file.url = _data;
132
+ file.storeUrl = _data;
133
+ file.name = getFullFileName(file.url);
134
+ file.filename = file.name;
135
+ file.originalFilename = getFullFileName(file.url);
136
+ file.type = getFileType(file.url);
137
+ file.ext = getFileExt(file.url);
138
+ } else if (typeof _data === "object") {
139
+ const sourceData = _data.originFileObj || _data;
140
+ file.id = _data.id || _data.uid;
141
+ file.url = sourceData.url || sourceData.ossUrl;
142
+ file.storeUrl = file.url;
143
+ file.originalFilename = _data.originalFilename || getFullFileName(file.url) || _data.name;
144
+ file.name = _data.filename || _data.name || getFullFileName(file.url);
145
+ file.filename = file.name;
146
+ file.originFileObj = data instanceof File ? data : undefined;
147
+ file.lastModified = _data.lastModified;
148
+ file.basePath = _data.basePath;
149
+ file.path = _data.path;
150
+ file.ext = getFileExt(file.url);
151
+ file.type = _data.contentType || _data.type;
152
+ file.contentType = file.type;
153
+ file.size = _data.size;
154
+ file.platform = _data.platform;
155
+ file.createTime = _data.createTime;
156
+ }
157
+
158
+ if (!file.id) {
159
+ file.id =
160
+ file.uid ||
161
+ `${
162
+ getFileName(file.url || file.name || file.filename) || "rc-upload"
163
+ }-${dayjs().valueOf()}-${nanoidNumALetters()}`;
164
+ }
165
+ if (!file.name) {
166
+ file.name = file.id;
167
+ }
168
+ if (!file.filename) {
169
+ file.filename = file.name;
170
+ }
171
+ if (!file.storeUrl) {
172
+ file.storeUrl = file.url;
173
+ }
174
+
175
+ // 预览地址
176
+ if (!file.previewUrl) {
177
+ const { getPreviewUrl, previewConfig } = opt || {};
178
+ file.previewUrl = getPreviewUrl ? getPreviewUrl(file, opt) : mergePreviewConfig(file, previewConfig);
179
+ }
180
+ // 缩略图地址
181
+ if (!file.thumbnailUrl) {
182
+ const { getThumbnailUrl, thumbnailUrlConf } = opt || {};
183
+ file.thumbnailUrl = getThumbnailUrl ? getThumbnailUrl(file, opt) : mergePreviewConfig(file, thumbnailUrlConf);
184
+ }
185
+
186
+ return file;
187
+ };
188
+
189
+ /**
190
+ * 解析传入的文件列表数据
191
+ */
192
+ export const parseFileList = (fileList, opt: INormalizationOpt) => {
193
+ if (!fileList) {
194
+ return [];
195
+ }
196
+
197
+ let _fileList = fileList;
198
+ const { listMode, split } = opt || {};
199
+
200
+ // splitStr jsonStr 模式下处理字符串
201
+ const isStr = typeof _fileList === "string";
202
+ if (isStr && listMode === "splitStr") {
203
+ // @ts-ignore
204
+ _fileList = _fileList?.split(split ?? ", ");
205
+ }
206
+
207
+ if (isStr && listMode === "jsonStr") {
208
+ _fileList = objStrToObj(_fileList);
209
+ }
210
+
211
+ const isArr = Array.isArray(_fileList);
212
+ // 统一成数组格式
213
+ if (_fileList !== null && _fileList !== undefined && !isArr) {
214
+ _fileList = [_fileList];
215
+ }
216
+
217
+ if (isArr) {
218
+ const arrRes = [];
219
+ _fileList.forEach((it) => {
220
+ const itRes = normalizationFileObj(it, opt);
221
+ itRes && arrRes.push(itRes);
222
+ });
223
+ return arrRes;
224
+ }
225
+ return _fileList;
226
+ };
227
+
228
+ /**
229
+ * 出参子项归一化
230
+ * 根据配置,将 对象 处理成所需格式
231
+ */
232
+ export const formatFile = function (file, opt: INormalizationOpt) {
233
+ const { itemMode = "object" } = opt || {};
234
+ if (itemMode === "file") {
235
+ return file?.originFileObj || file;
236
+ }
237
+ if (itemMode === "object") {
238
+ return normalizationFileObj(file, opt);
239
+ }
240
+ if (itemMode === "jsonStr" && typeof file !== "string") {
241
+ const { originFileObj, ...jFile } = normalizationFileObj(file, opt);
242
+ return JSON.stringify({ ...jFile });
243
+ }
244
+ if (itemMode === "url") {
245
+ return typeof file === "string" ? file : file.originFileObj?.url || file?.url;
246
+ }
247
+ return file;
248
+ };
249
+
250
+ /**
251
+ * 出参 fileList 归一化
252
+ * 根据配置,将 对象 处理成所需格式
253
+ */
254
+ export const formatFileList = function (fileList, opt: INormalizationOpt) {
255
+ if (!fileList) {
256
+ return undefined;
257
+ }
258
+
259
+ const { listMode, split } = opt || {};
260
+
261
+ let _fileList = fileList;
262
+ if (_fileList && !Array.isArray(_fileList)) {
263
+ _fileList = [fileList];
264
+ }
265
+
266
+ // 数组
267
+ if (listMode === "array") {
268
+ return _fileList?.map((it) => formatFile(it, opt));
269
+ }
270
+ // 序列化后的字符串
271
+ if (listMode === "jsonStr") {
272
+ return JSON.stringify(_fileList?.map((it) => formatFile(it, opt)));
273
+ }
274
+ // join 后的字符串
275
+ if (listMode === "splitStr") {
276
+ return _fileList
277
+ ?.map((it) => formatFile(it, opt))
278
+ .filter((it) => it)
279
+ .join(split ?? ", ");
280
+ }
281
+ };
@@ -1,23 +1,23 @@
1
- import { mergeDirStr, getFileNameByFileObj } from "./uploadUtils";
2
- import OssUploadUtil, { axios, IUploadOpt } from "./OssUploadUtil";
3
-
4
- /**
5
- * oss 上传工具类
6
- */
7
- class OssUpload extends OssUploadUtil {
8
- getSignature(serverUrl = this.serverUrl, opt) {
9
- // dir 前缀 oss-upload 文件目录
10
- const prePath = opt?.params?.hasPrePath !== false ? "web-upload/" : "";
11
- opt.params.dir = mergeDirStr(prePath, opt.params.dir);
12
- return this._getSignature(serverUrl, opt);
13
- }
14
-
15
- upload(file, opt: IUploadOpt = {}): Promise<{ fileUrl: string }> {
16
- const fileName = getFileNameByFileObj(file, opt);
17
- return this._upload(file, { ...opt, fileName });
18
- }
19
- }
20
-
21
- export { axios };
22
-
23
- export default OssUpload;
1
+ import { mergeDirStr, getFileNameByFileObj } from "./uploadUtils";
2
+ import OssUploadUtil, { axios, IUploadOpt } from "./OssUploadUtil";
3
+
4
+ /**
5
+ * oss 上传工具类
6
+ */
7
+ class OssUpload extends OssUploadUtil {
8
+ getSignature(serverUrl = this.serverUrl, opt) {
9
+ // dir 前缀 oss-upload 文件目录
10
+ const prePath = opt?.params?.hasPrePath !== false ? "web-upload/" : "";
11
+ opt.params.dir = mergeDirStr(prePath, opt.params.dir);
12
+ return this._getSignature(serverUrl, opt);
13
+ }
14
+
15
+ upload(file, opt: IUploadOpt = {}): Promise<{ fileUrl: string }> {
16
+ const fileName = getFileNameByFileObj(file, opt);
17
+ return this._upload(file, { ...opt, fileName });
18
+ }
19
+ }
20
+
21
+ export { axios };
22
+
23
+ export default OssUpload;