@hzab/utils 1.0.14 → 1.0.16
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 -0
- package/package.json +1 -1
- package/src/img-utils.ts +2 -0
- package/src/scan-qr.ts +1 -1
- package/src/upload/OssUploadUtil.ts +218 -214
- package/src/url.ts +11 -0
package/changelog.md
CHANGED
package/package.json
CHANGED
package/src/img-utils.ts
CHANGED
package/src/scan-qr.ts
CHANGED
|
@@ -64,7 +64,7 @@ const setCodeInfo = async (
|
|
|
64
64
|
try {
|
|
65
65
|
const id = nanoidUrl();
|
|
66
66
|
const file = objToBlob(value) as File;
|
|
67
|
-
const ossUploader = new OssUploads();
|
|
67
|
+
const ossUploader = new OssUploads({signatureParams: {withoutPrefix: true}});
|
|
68
68
|
const uploadResult = await ossUploader.upload(file, {
|
|
69
69
|
fileName: id,
|
|
70
70
|
params: {
|
|
@@ -1,214 +1,218 @@
|
|
|
1
|
-
import dayjs from "dayjs";
|
|
2
|
-
import { Axios, AxiosResponse, AxiosRequestConfig } from "axios";
|
|
3
|
-
|
|
4
|
-
import { axios } from "@hzab/data-model";
|
|
5
|
-
import { formatDirStr } from "./uploadUtils";
|
|
6
|
-
import { getGlobalServeConfig } from "../globalConfig";
|
|
7
|
-
const isPublicMap = {
|
|
8
|
-
0: "&",
|
|
9
|
-
1: "?",
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* getSignature 配置
|
|
13
|
-
*/
|
|
14
|
-
export interface IGetSignatureOpt {
|
|
15
|
-
/** 获取配置的接口地址 */
|
|
16
|
-
serverUrl?: string;
|
|
17
|
-
/** axios 实例 */
|
|
18
|
-
axios?: Axios;
|
|
19
|
-
/** axios 配置参数 */
|
|
20
|
-
axiosConf?: AxiosRequestConfig;
|
|
21
|
-
/** 获取配置的接口自定义入参 */
|
|
22
|
-
params?: {
|
|
23
|
-
/** 文件路径 */
|
|
24
|
-
dir?: string;
|
|
25
|
-
/** 是否是公开库 */
|
|
26
|
-
isPublic?: number;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* OssUpload props 参数
|
|
32
|
-
*/
|
|
33
|
-
export interface IOssUploadProps {
|
|
34
|
-
/** axios 实例 */
|
|
35
|
-
axios?: Axios;
|
|
36
|
-
/** axios 配置参数 */
|
|
37
|
-
axiosConf?: AxiosRequestConfig;
|
|
38
|
-
/** 获取配置的接口地址 */
|
|
39
|
-
serverUrl?: string;
|
|
40
|
-
/** 获取配置的接口自定义入参 */
|
|
41
|
-
signatureParams?: {
|
|
42
|
-
/** 文件路径 */
|
|
43
|
-
dir?: string;
|
|
44
|
-
/** 是否是公开库 */
|
|
45
|
-
isPublic?: number;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
/** axios
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
params
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
/** axios
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return this.
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
return
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import { Axios, AxiosResponse, AxiosRequestConfig } from "axios";
|
|
3
|
+
|
|
4
|
+
import { axios } from "@hzab/data-model";
|
|
5
|
+
import { formatDirStr } from "./uploadUtils";
|
|
6
|
+
import { getGlobalServeConfig } from "../globalConfig";
|
|
7
|
+
const isPublicMap = {
|
|
8
|
+
0: "&",
|
|
9
|
+
1: "?",
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* getSignature 配置
|
|
13
|
+
*/
|
|
14
|
+
export interface IGetSignatureOpt {
|
|
15
|
+
/** 获取配置的接口地址 */
|
|
16
|
+
serverUrl?: string;
|
|
17
|
+
/** axios 实例 */
|
|
18
|
+
axios?: Axios;
|
|
19
|
+
/** axios 配置参数 */
|
|
20
|
+
axiosConf?: AxiosRequestConfig;
|
|
21
|
+
/** 获取配置的接口自定义入参 */
|
|
22
|
+
params?: {
|
|
23
|
+
/** 文件路径 */
|
|
24
|
+
dir?: string;
|
|
25
|
+
/** 是否是公开库 */
|
|
26
|
+
isPublic?: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* OssUpload props 参数
|
|
32
|
+
*/
|
|
33
|
+
export interface IOssUploadProps {
|
|
34
|
+
/** axios 实例 */
|
|
35
|
+
axios?: Axios;
|
|
36
|
+
/** axios 配置参数 */
|
|
37
|
+
axiosConf?: AxiosRequestConfig;
|
|
38
|
+
/** 获取配置的接口地址 */
|
|
39
|
+
serverUrl?: string;
|
|
40
|
+
/** 获取配置的接口自定义入参 */
|
|
41
|
+
signatureParams?: {
|
|
42
|
+
/** 文件路径 */
|
|
43
|
+
dir?: string;
|
|
44
|
+
/** 是否是公开库 */
|
|
45
|
+
isPublic?: number;
|
|
46
|
+
/** 是否无前缀 */
|
|
47
|
+
withoutPrefix?: boolean;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface IUploadOpt {
|
|
52
|
+
fileName?: string;
|
|
53
|
+
/** axios 实例 */
|
|
54
|
+
axios?: Axios;
|
|
55
|
+
/** axios 配置参数 */
|
|
56
|
+
axiosConf?: AxiosRequestConfig;
|
|
57
|
+
/** 获取配置的接口地址 */
|
|
58
|
+
serverUrl?: string;
|
|
59
|
+
/** 获取配置的接口自定义入参 */
|
|
60
|
+
params?: {
|
|
61
|
+
/** 文件路径 */
|
|
62
|
+
dir?: string;
|
|
63
|
+
/** 是否是公开库 */
|
|
64
|
+
isPublic?: number;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* 获取配置接口请求入参
|
|
68
|
+
*/
|
|
69
|
+
signatureParams?: {
|
|
70
|
+
/** 公开还是私有 */
|
|
71
|
+
isPublic?: number;
|
|
72
|
+
};
|
|
73
|
+
/** 文件上传的接口自定义入参 */
|
|
74
|
+
ossParams?: {};
|
|
75
|
+
/** 是否使用 hash 文件名 */
|
|
76
|
+
useHashName?: boolean;
|
|
77
|
+
/**缩略图参数 */
|
|
78
|
+
thumbnailParams?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface ResponseData extends AxiosResponse {
|
|
82
|
+
fileUrl: string;
|
|
83
|
+
thumbnailUrl?: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function getSignature(opt: IGetSignatureOpt = {}) {
|
|
87
|
+
const { serverUrl = getGlobalServeConfig()?.serverUrl || "/api/v1/user/oss/getWebOssConfig" } = opt;
|
|
88
|
+
// 减 10 秒,避免发起请求时 刚好过期的情况
|
|
89
|
+
if (
|
|
90
|
+
window._$ossSignatureRes &&
|
|
91
|
+
serverUrl === window._$ossSignatureRes.serverUrl &&
|
|
92
|
+
dayjs().valueOf() - window._$ossSignatureRes.__saveTime < window._$ossSignatureRes.expireTimeMilles - 10000
|
|
93
|
+
) {
|
|
94
|
+
return Promise.resolve(window._$ossSignatureRes);
|
|
95
|
+
}
|
|
96
|
+
const { axios: _ax = axios, params = {}, axiosConf } = opt;
|
|
97
|
+
// 处理 dir 格式,必须为非 / 开头, / 结尾。如: test/
|
|
98
|
+
params.dir = formatDirStr(params.dir);
|
|
99
|
+
|
|
100
|
+
return _ax
|
|
101
|
+
.get(serverUrl, {
|
|
102
|
+
...axiosConf,
|
|
103
|
+
params: {
|
|
104
|
+
isPublic: 1,
|
|
105
|
+
...params,
|
|
106
|
+
},
|
|
107
|
+
})
|
|
108
|
+
.then((res) => {
|
|
109
|
+
window._$ossSignatureRes = res?.data?.data ?? res?.data ?? res;
|
|
110
|
+
if (window._$ossSignatureRes) {
|
|
111
|
+
window._$ossSignatureRes.__saveTime = dayjs().valueOf();
|
|
112
|
+
window._$ossSignatureRes.serverUrl = serverUrl;
|
|
113
|
+
}
|
|
114
|
+
return window._$ossSignatureRes;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* oss 上传工具类
|
|
120
|
+
*/
|
|
121
|
+
class OssUploadUtil {
|
|
122
|
+
/** axios 实例 */
|
|
123
|
+
axios: Axios;
|
|
124
|
+
/** axios 配置参数 */
|
|
125
|
+
axiosConf: AxiosRequestConfig;
|
|
126
|
+
/** 获取配置的接口地址 */
|
|
127
|
+
serverUrl: string;
|
|
128
|
+
/** 获取配置的接口自定义入参 */
|
|
129
|
+
signatureParams?: {
|
|
130
|
+
/** 文件路径 */
|
|
131
|
+
dir?: string;
|
|
132
|
+
/** 是否是公开库 */
|
|
133
|
+
isPublic?: number;
|
|
134
|
+
/** 是否无前缀 */
|
|
135
|
+
withoutPrefix?: boolean;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
constructor(props: IOssUploadProps = {}) {
|
|
139
|
+
this.axios = props.axios || axios;
|
|
140
|
+
this.axiosConf = props.axiosConf || {};
|
|
141
|
+
this.serverUrl = props.serverUrl || getGlobalServeConfig()?.serverUrl || "/api/v1/user/oss/getWebOssConfig";
|
|
142
|
+
this.signatureParams = props.signatureParams || {};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
getSignature(serverUrl = this.serverUrl, opt) {
|
|
146
|
+
return this._getSignature(serverUrl, opt);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
upload(file, opt: IUploadOpt = {}): Promise<{ fileUrl: string }> {
|
|
150
|
+
return this._upload(file, { ...opt });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
_getSignature(serverUrl = this.serverUrl, opt) {
|
|
154
|
+
return getSignature({
|
|
155
|
+
...opt,
|
|
156
|
+
serverUrl,
|
|
157
|
+
axios: opt?.axios || this.axios,
|
|
158
|
+
axiosConf: { ...this.axiosConf, ...opt?.axiosConf },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
_upload(file, opt: IUploadOpt = {}): Promise<{ fileUrl: string }> {
|
|
163
|
+
return new Promise(async (resolve, reject) => {
|
|
164
|
+
const ossParams = await this._getSignature(opt.serverUrl || this.serverUrl, {
|
|
165
|
+
...opt,
|
|
166
|
+
params: { ...this.signatureParams, ...opt.params },
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const { ossParams: propOssParams, fileName } = opt || {};
|
|
170
|
+
const formData = new FormData();
|
|
171
|
+
// key 表示上传到 Bucket 内的 Object 的完整路径,例如 exampledir/exampleobject.txtObject,完整路径中不能包含 Bucket 名称。
|
|
172
|
+
// filename 表示待上传的本地文件名称。
|
|
173
|
+
const filename = fileName || file.name;
|
|
174
|
+
const key = `${ossParams?.dir}${filename}`;
|
|
175
|
+
formData.set("key", key);
|
|
176
|
+
formData.set("OSSAccessKeyId", ossParams.accessid);
|
|
177
|
+
formData.set("policy", ossParams.policy);
|
|
178
|
+
formData.set("Signature", ossParams.signature);
|
|
179
|
+
if (ossParams.callback) {
|
|
180
|
+
formData.set("callback", ossParams.callback);
|
|
181
|
+
}
|
|
182
|
+
// @ts-ignore
|
|
183
|
+
formData.set("success_action_status", 200);
|
|
184
|
+
formData.set("file", file);
|
|
185
|
+
|
|
186
|
+
if (propOssParams) {
|
|
187
|
+
for (const key in propOssParams) {
|
|
188
|
+
if (Object.hasOwnProperty.call(propOssParams, key)) {
|
|
189
|
+
formData.set(key, propOssParams[key]);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const _axios = opt?.axios || this.axios;
|
|
195
|
+
|
|
196
|
+
return _axios
|
|
197
|
+
.post(ossParams.host, formData, { ...this.axiosConf, ...opt?.axiosConf })
|
|
198
|
+
.then((res: ResponseData) => {
|
|
199
|
+
if (getGlobalServeConfig()?.showThumbnail) {
|
|
200
|
+
res.data.data.thumbnailUrl = `${res?.data?.data?.fileUrl}${
|
|
201
|
+
opt?.thumbnailParams ? isPublicMap[opt?.signatureParams?.isPublic] + opt?.thumbnailParams : ""
|
|
202
|
+
}`;
|
|
203
|
+
}
|
|
204
|
+
resolve(res);
|
|
205
|
+
return res;
|
|
206
|
+
})
|
|
207
|
+
.catch((err) => {
|
|
208
|
+
console.error("oss upload err", err);
|
|
209
|
+
reject(err);
|
|
210
|
+
return Promise.reject(err);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export { axios };
|
|
217
|
+
|
|
218
|
+
export default OssUploadUtil;
|
package/src/url.ts
CHANGED
|
@@ -119,5 +119,16 @@ export function searchToObj(url) {
|
|
|
119
119
|
return res;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
/**
|
|
123
|
+
* 添加 url 中的 query 的参数
|
|
124
|
+
* @param url
|
|
125
|
+
* @param params
|
|
126
|
+
* @returns
|
|
127
|
+
*/
|
|
128
|
+
export function addQuery(url, params) {
|
|
129
|
+
const newObj = { ...searchToObj(url), ...params }
|
|
130
|
+
return replaceSearch(url, objToSearch(newObj, !!params))
|
|
131
|
+
}
|
|
132
|
+
|
|
122
133
|
|
|
123
134
|
|