@haluo/util 2.0.18 → 2.0.20
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/dist/index.d.ts +3 -1
- package/dist/index.js +4 -1
- package/dist/modules/open-app/index.js +6 -0
- package/dist/modules/upload/ALIOSS_EXAMPLE.d.ts +83 -0
- package/dist/modules/upload/ALIOSS_EXAMPLE.js +320 -0
- package/dist/modules/upload/aliOss.d.ts +272 -0
- package/dist/modules/upload/aliOss.js +864 -0
- package/dist/modules/upload/index.d.ts +6 -0
- package/dist/modules/upload/index.js +20 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,864 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file 阿里云OSS上传统一工具类
|
|
4
|
+
* @description 整合所有项目的aliOss业务逻辑,通过传参形式支持不同业务场景
|
|
5
|
+
* @Author: wanghui
|
|
6
|
+
* @createBy: @2025.11.17
|
|
7
|
+
*
|
|
8
|
+
* 文档:https://help.aliyun.com/document_detail/64041.html
|
|
9
|
+
*
|
|
10
|
+
* 使用示例:
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { createAliOssUploader } from '@haluo/util'
|
|
13
|
+
*
|
|
14
|
+
* // 创建上传实例,传入业务相关的API函数
|
|
15
|
+
* const ossUploader = createAliOssUploader({
|
|
16
|
+
* getAliyunSts: (params) => api.getAliyunSts(params),
|
|
17
|
+
* darkWaterUploadImage: (params) => api.darkWaterUploadImage(params),
|
|
18
|
+
* multiTransferImage: (params) => api.multiTransferImage(params),
|
|
19
|
+
* aliyunPersist: (params) => api.aliyunPersist(params),
|
|
20
|
+
* generatePrePresignedUrl: (params) => api.generatePrePresignedUrl(params),
|
|
21
|
+
* uploadConf: (params) => api.uploadConf(params),
|
|
22
|
+
* dateFormat: util.date.format, // 或 util.filter.format
|
|
23
|
+
* messageWarning: (msg) => window.$message.warning(msg)
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // 图片上传
|
|
27
|
+
* ossUploader.ossUploadImage({
|
|
28
|
+
* file: file,
|
|
29
|
+
* imageType: 'official', // nowater、official、panoram、forum、avatar、square、carport
|
|
30
|
+
* quality: 0.7, // 压缩质量
|
|
31
|
+
* businessType: 1500, // 业务类型:0(无水印)、1(头像)、4(GIF)、6(视频)、8(UnProtect)、1000(文章)、1199(私有)、1299(加密)、1500(默认)
|
|
32
|
+
* batchTransfer: false, // 是否批量转换水印
|
|
33
|
+
* notCompress: false, // 是否不压缩
|
|
34
|
+
* idCard: false, // 是否身份证上传
|
|
35
|
+
* onProgress: (e) => console.log(e.percent),
|
|
36
|
+
* onSuccess: (val) => console.log(val),
|
|
37
|
+
* onError: (err) => console.error(err)
|
|
38
|
+
* })
|
|
39
|
+
*
|
|
40
|
+
* // 文件上传
|
|
41
|
+
* ossUploader.ossUploadFile({
|
|
42
|
+
* file: file,
|
|
43
|
+
* isVideo: false, // 是否视频
|
|
44
|
+
* isUnProtect: false, // 是否UnProtect
|
|
45
|
+
* isDocument: false, // 是否文档
|
|
46
|
+
* businessType: 1500,
|
|
47
|
+
* onProgress: (e) => console.log(e.percent),
|
|
48
|
+
* onSuccess: (val) => console.log(val),
|
|
49
|
+
* onError: (err) => console.error(err)
|
|
50
|
+
* })
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
var __assign = (this && this.__assign) || function () {
|
|
54
|
+
__assign = Object.assign || function(t) {
|
|
55
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
56
|
+
s = arguments[i];
|
|
57
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
58
|
+
t[p] = s[p];
|
|
59
|
+
}
|
|
60
|
+
return t;
|
|
61
|
+
};
|
|
62
|
+
return __assign.apply(this, arguments);
|
|
63
|
+
};
|
|
64
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
65
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
66
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
67
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
68
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
69
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
70
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
74
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
75
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
76
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
77
|
+
function step(op) {
|
|
78
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
79
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
80
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
81
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
82
|
+
switch (op[0]) {
|
|
83
|
+
case 0: case 1: t = op; break;
|
|
84
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
85
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
86
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
87
|
+
default:
|
|
88
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
89
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
90
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
91
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
92
|
+
if (t[2]) _.ops.pop();
|
|
93
|
+
_.trys.pop(); continue;
|
|
94
|
+
}
|
|
95
|
+
op = body.call(thisArg, _);
|
|
96
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
97
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
101
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
102
|
+
};
|
|
103
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
104
|
+
exports.createAliOssUploader = exports.SuffixEnum = exports.BusinessType = void 0;
|
|
105
|
+
var ali_oss_1 = __importDefault(require("ali-oss"));
|
|
106
|
+
var lrz_1 = __importDefault(require("lrz"));
|
|
107
|
+
// ==================== 常量定义 ====================
|
|
108
|
+
/** 支持的图片格式 */
|
|
109
|
+
var SUPPORTED_IMAGE_TYPES = ['image/png', 'image/gif', 'image/jpg', 'image/jpeg'];
|
|
110
|
+
/** 小图片阈值(KB) */
|
|
111
|
+
var SMALL_IMAGE_THRESHOLD = 100;
|
|
112
|
+
/** 长图宽高比阈值 */
|
|
113
|
+
var LONG_IMAGE_RATIO = 2;
|
|
114
|
+
/** 默认文件大小限制(MB) */
|
|
115
|
+
var DEFAULT_FILE_SIZE_LIMIT = 10;
|
|
116
|
+
/** 默认压缩质量 */
|
|
117
|
+
var DEFAULT_QUALITY = 0.7;
|
|
118
|
+
/** 默认图片类型 */
|
|
119
|
+
var DEFAULT_IMAGE_TYPE = 'official';
|
|
120
|
+
/** OSS默认区域 */
|
|
121
|
+
var DEFAULT_OSS_REGION = 'oss-cn-beijing';
|
|
122
|
+
/** 预签名URL过期时间(毫秒) */
|
|
123
|
+
var PRESIGNED_URL_EXPIRE_TIME = 60000;
|
|
124
|
+
/** 随机字符串字符集 */
|
|
125
|
+
var RANDOM_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|
126
|
+
/** OSS元数据 */
|
|
127
|
+
var OSS_META_PEOPLE = 'x-oss-meta-motor';
|
|
128
|
+
// ==================== 枚举定义 ====================
|
|
129
|
+
/**
|
|
130
|
+
* 业务类型枚举
|
|
131
|
+
* 不同的businessType对应不同的OSS bucket和水印策略
|
|
132
|
+
*/
|
|
133
|
+
var BusinessType;
|
|
134
|
+
(function (BusinessType) {
|
|
135
|
+
BusinessType[BusinessType["NO_WATER"] = 0] = "NO_WATER";
|
|
136
|
+
BusinessType[BusinessType["AVATAR"] = 1] = "AVATAR";
|
|
137
|
+
BusinessType[BusinessType["GIF"] = 4] = "GIF";
|
|
138
|
+
BusinessType[BusinessType["VIDEO"] = 6] = "VIDEO";
|
|
139
|
+
BusinessType[BusinessType["UNPROTECT"] = 8] = "UNPROTECT";
|
|
140
|
+
BusinessType[BusinessType["ARTICLE"] = 1000] = "ARTICLE";
|
|
141
|
+
BusinessType[BusinessType["PRIVATE"] = 1199] = "PRIVATE";
|
|
142
|
+
BusinessType[BusinessType["ENCRYPTED"] = 1299] = "ENCRYPTED";
|
|
143
|
+
BusinessType[BusinessType["DEFAULT"] = 1500] = "DEFAULT"; // 默认
|
|
144
|
+
})(BusinessType = exports.BusinessType || (exports.BusinessType = {}));
|
|
145
|
+
/**
|
|
146
|
+
* 图片类型后缀枚举
|
|
147
|
+
*/
|
|
148
|
+
exports.SuffixEnum = {
|
|
149
|
+
nowater: '!nowater',
|
|
150
|
+
official: '!official',
|
|
151
|
+
panoram: '!panoram',
|
|
152
|
+
forum: '!forum',
|
|
153
|
+
avatar: '!avatar',
|
|
154
|
+
square: '!square',
|
|
155
|
+
carport: '!carport' // 车库、经销商水印
|
|
156
|
+
};
|
|
157
|
+
/** 不打水印的图片类型 */
|
|
158
|
+
var NO_WATER_IMAGE_TYPES = ['nowater', 'forum'];
|
|
159
|
+
// ==================== 工具函数 ====================
|
|
160
|
+
/**
|
|
161
|
+
* 生成随机字符串
|
|
162
|
+
* @param length 字符串长度
|
|
163
|
+
* @returns 随机字符串
|
|
164
|
+
*/
|
|
165
|
+
function randomString(length) {
|
|
166
|
+
var result = '';
|
|
167
|
+
for (var i = 0; i < length; i++) {
|
|
168
|
+
var randomIndex = Math.floor(Math.random() * RANDOM_CHARS.length);
|
|
169
|
+
result += RANDOM_CHARS[randomIndex];
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 过滤对象中的undefined值
|
|
175
|
+
* @param obj 原始对象
|
|
176
|
+
* @returns 过滤后的对象
|
|
177
|
+
*/
|
|
178
|
+
function filterUndefined(obj) {
|
|
179
|
+
var result = {};
|
|
180
|
+
Object.keys(obj).forEach(function (key) {
|
|
181
|
+
if (obj[key] !== undefined) {
|
|
182
|
+
result[key] = obj[key];
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 检查是否为不打水印的图片类型
|
|
189
|
+
* @param imageType 图片类型
|
|
190
|
+
* @returns 是否不打水印
|
|
191
|
+
*/
|
|
192
|
+
function isNoWaterImageType(imageType) {
|
|
193
|
+
return NO_WATER_IMAGE_TYPES.includes(imageType);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 检查文件类型是否支持
|
|
197
|
+
* @param fileType 文件类型
|
|
198
|
+
* @returns 是否支持
|
|
199
|
+
*/
|
|
200
|
+
function isSupportedImageType(fileType) {
|
|
201
|
+
return SUPPORTED_IMAGE_TYPES.includes(fileType);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 计算文件大小(KB)
|
|
205
|
+
* @param size 文件大小(字节)
|
|
206
|
+
* @returns 文件大小(KB)
|
|
207
|
+
*/
|
|
208
|
+
function getFileSizeInKB(size) {
|
|
209
|
+
return Math.floor(size / 1024);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 计算文件大小(MB)
|
|
213
|
+
* @param size 文件大小(字节)
|
|
214
|
+
* @returns 文件大小(MB)
|
|
215
|
+
*/
|
|
216
|
+
function getFileSizeInMB(size) {
|
|
217
|
+
return size / (1024 * 1024);
|
|
218
|
+
}
|
|
219
|
+
// ==================== 主函数 ====================
|
|
220
|
+
/**
|
|
221
|
+
* 创建阿里云OSS上传器
|
|
222
|
+
* @param apiConfig API配置对象,包含业务相关的API函数
|
|
223
|
+
* @returns OSS上传器实例
|
|
224
|
+
*/
|
|
225
|
+
function createAliOssUploader(apiConfig) {
|
|
226
|
+
// 缓存OSS客户端实例(可选)
|
|
227
|
+
var clientCache = new Map();
|
|
228
|
+
/**
|
|
229
|
+
* 创建OSS客户端
|
|
230
|
+
* @param businessType 业务类型
|
|
231
|
+
* @param imggeCarType 车辆图片类型(可选,用于特定业务)
|
|
232
|
+
* @returns OSS客户端实例
|
|
233
|
+
*/
|
|
234
|
+
function createOssClient(businessType, imggeCarType) {
|
|
235
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
236
|
+
var cacheKey, res, clientParams, filteredParams, client;
|
|
237
|
+
return __generator(this, function (_a) {
|
|
238
|
+
switch (_a.label) {
|
|
239
|
+
case 0:
|
|
240
|
+
cacheKey = "".concat(businessType, "_").concat(imggeCarType || 'default');
|
|
241
|
+
return [4 /*yield*/, apiConfig.getAliyunSts({ businessType: businessType, imggeCarType: imggeCarType })];
|
|
242
|
+
case 1:
|
|
243
|
+
res = _a.sent();
|
|
244
|
+
if (res.data.code !== 0) {
|
|
245
|
+
throw new Error('获取OSS配置失败');
|
|
246
|
+
}
|
|
247
|
+
clientParams = res.data.data || {};
|
|
248
|
+
clientParams.suffix = clientParams.style || '';
|
|
249
|
+
filteredParams = filterUndefined(clientParams);
|
|
250
|
+
client = new ali_oss_1.default(__assign({ region: DEFAULT_OSS_REGION }, filteredParams));
|
|
251
|
+
// 保存客户端选项供后续使用
|
|
252
|
+
client.options = __assign(__assign({}, client.options), { realmName: clientParams.realmName, suffix: clientParams.suffix });
|
|
253
|
+
clientCache.set(cacheKey, client);
|
|
254
|
+
return [2 /*return*/, client];
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 预加载图片获取尺寸
|
|
261
|
+
* @param file 文件对象
|
|
262
|
+
* @returns 图片对象
|
|
263
|
+
*/
|
|
264
|
+
function imgUpload(file) {
|
|
265
|
+
return new Promise(function (resolve, reject) {
|
|
266
|
+
var URL = window.URL || window.webkitURL;
|
|
267
|
+
var image = new Image();
|
|
268
|
+
var objectUrl = URL.createObjectURL(file);
|
|
269
|
+
image.onload = function () {
|
|
270
|
+
URL.revokeObjectURL(objectUrl); // 释放内存
|
|
271
|
+
resolve(image);
|
|
272
|
+
};
|
|
273
|
+
image.onerror = function () {
|
|
274
|
+
URL.revokeObjectURL(objectUrl); // 释放内存
|
|
275
|
+
reject(new Error('图片加载失败'));
|
|
276
|
+
};
|
|
277
|
+
image.src = objectUrl;
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 生成文件名
|
|
282
|
+
* @param imageType 图片类型
|
|
283
|
+
* @param extension 文件扩展名
|
|
284
|
+
* @returns 文件名信息
|
|
285
|
+
*/
|
|
286
|
+
function generateFileName(imageType, extension) {
|
|
287
|
+
var now = new Date();
|
|
288
|
+
var year = apiConfig.dateFormat(now, 'YYYY');
|
|
289
|
+
var date = apiConfig.dateFormat(now, 'YYYYMMDD');
|
|
290
|
+
var dateTime = apiConfig.dateFormat(now, 'YYYYMMDDHHmmss');
|
|
291
|
+
var randomStr = randomString(4);
|
|
292
|
+
var fileName = "".concat(imageType, "/").concat(date, "/").concat(dateTime, "_").concat(randomStr).concat(extension);
|
|
293
|
+
return { year: year, fileName: fileName };
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* 检查图片是否为长图
|
|
297
|
+
* @param width 图片宽度
|
|
298
|
+
* @param height 图片高度
|
|
299
|
+
* @returns 是否为长图
|
|
300
|
+
*/
|
|
301
|
+
function isLongImage(width, height) {
|
|
302
|
+
var maxDimension = Math.max(width, height);
|
|
303
|
+
var minDimension = Math.min(width, height);
|
|
304
|
+
return maxDimension / minDimension > LONG_IMAGE_RATIO;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* 执行OSS上传
|
|
308
|
+
* @param client OSS客户端
|
|
309
|
+
* @param fileName 文件名
|
|
310
|
+
* @param file 文件对象
|
|
311
|
+
* @param year 年份
|
|
312
|
+
* @param mimeType MIME类型
|
|
313
|
+
* @param onProgress 进度回调
|
|
314
|
+
* @returns 上传结果
|
|
315
|
+
*/
|
|
316
|
+
function performOssUpload(client, fileName, file, year, mimeType, onProgress) {
|
|
317
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
318
|
+
return __generator(this, function (_a) {
|
|
319
|
+
switch (_a.label) {
|
|
320
|
+
case 0: return [4 /*yield*/, client.multipartUpload(fileName, file, {
|
|
321
|
+
progress: function (p) {
|
|
322
|
+
onProgress === null || onProgress === void 0 ? void 0 : onProgress({ percent: Math.floor(p * 100) });
|
|
323
|
+
},
|
|
324
|
+
meta: { year: year, people: OSS_META_PEOPLE },
|
|
325
|
+
mime: mimeType
|
|
326
|
+
})];
|
|
327
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* 确定业务类型
|
|
334
|
+
* @param option 上传选项
|
|
335
|
+
* @param isGif 是否为GIF
|
|
336
|
+
* @returns 业务类型
|
|
337
|
+
*/
|
|
338
|
+
function determineBusinessType(option, isGif) {
|
|
339
|
+
// 如果已指定businessType,直接使用
|
|
340
|
+
if (option.businessType !== undefined) {
|
|
341
|
+
return option.businessType;
|
|
342
|
+
}
|
|
343
|
+
var imageType = option.imageType || DEFAULT_IMAGE_TYPE;
|
|
344
|
+
// 注释:GIF图片使用businessType=4
|
|
345
|
+
if (isGif) {
|
|
346
|
+
return BusinessType.GIF;
|
|
347
|
+
}
|
|
348
|
+
// 注释:根据imageType确定默认businessType
|
|
349
|
+
if (imageType === 'avatar') {
|
|
350
|
+
return BusinessType.AVATAR;
|
|
351
|
+
}
|
|
352
|
+
if (isNoWaterImageType(imageType)) {
|
|
353
|
+
return BusinessType.NO_WATER;
|
|
354
|
+
}
|
|
355
|
+
return BusinessType.DEFAULT;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* 加载图片并返回结果
|
|
359
|
+
* 用于标准的图片上传场景
|
|
360
|
+
* @param params 加载参数
|
|
361
|
+
*/
|
|
362
|
+
function loadImage(params) {
|
|
363
|
+
var url = params.url, val = params.val, suffix = params.suffix, file = params.file, option = params.option, resolve = params.resolve, reject = params.reject, isGif = params.isGif;
|
|
364
|
+
var img = new Image();
|
|
365
|
+
img.src = url;
|
|
366
|
+
img.onload = function () {
|
|
367
|
+
var _a;
|
|
368
|
+
if (!img)
|
|
369
|
+
return;
|
|
370
|
+
val.imgOrgUrl = "".concat(url, "?_").concat(img.width, "_").concat(img.height);
|
|
371
|
+
// 注释:全景图和GIF图片缩略图后缀不带300,其他需要
|
|
372
|
+
val.imgUrl =
|
|
373
|
+
suffix === '!panoram' || isGif
|
|
374
|
+
? "".concat(url, "?_").concat(img.width, "_").concat(img.height)
|
|
375
|
+
: "".concat(url, "300?_").concat(img.width, "_").concat(img.height);
|
|
376
|
+
val.name = file.name;
|
|
377
|
+
val.fileName = file.name;
|
|
378
|
+
(_a = option.onSuccess) === null || _a === void 0 ? void 0 : _a.call(option, val);
|
|
379
|
+
resolve(val);
|
|
380
|
+
img = null;
|
|
381
|
+
};
|
|
382
|
+
img.onerror = function () {
|
|
383
|
+
var _a;
|
|
384
|
+
(_a = option.onError) === null || _a === void 0 ? void 0 : _a.call(option, '图片加载失败');
|
|
385
|
+
reject('图片加载失败');
|
|
386
|
+
img = null;
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* 加载图片并返回结果(新版)
|
|
391
|
+
* 用于avatar、idCard等特殊场景,返回格式不同
|
|
392
|
+
* @param params 加载参数
|
|
393
|
+
*/
|
|
394
|
+
function loadImageNew(params) {
|
|
395
|
+
var url = params.url, val = params.val, file = params.file, option = params.option, resolve = params.resolve, reject = params.reject;
|
|
396
|
+
var img = new Image();
|
|
397
|
+
img.src = url;
|
|
398
|
+
img.onload = function () {
|
|
399
|
+
var _a;
|
|
400
|
+
val.imgOrgUrl = url;
|
|
401
|
+
val.imgUrl = val.name;
|
|
402
|
+
val.name = file.name;
|
|
403
|
+
val.fileName = file.name;
|
|
404
|
+
(_a = option.onSuccess) === null || _a === void 0 ? void 0 : _a.call(option, val);
|
|
405
|
+
resolve(val);
|
|
406
|
+
img = null;
|
|
407
|
+
};
|
|
408
|
+
img.onerror = function () {
|
|
409
|
+
var _a;
|
|
410
|
+
(_a = option.onError) === null || _a === void 0 ? void 0 : _a.call(option, '图片加载失败');
|
|
411
|
+
reject('图片加载失败');
|
|
412
|
+
img = null;
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* 图片上传主方法
|
|
417
|
+
* 整合了所有项目的图片上传逻辑
|
|
418
|
+
* @param option 上传选项
|
|
419
|
+
* @returns Promise
|
|
420
|
+
*/
|
|
421
|
+
function ossUploadImage(option) {
|
|
422
|
+
var _a;
|
|
423
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
424
|
+
var file, callbacks;
|
|
425
|
+
var _this = this;
|
|
426
|
+
return __generator(this, function (_b) {
|
|
427
|
+
file = option.file;
|
|
428
|
+
callbacks = {
|
|
429
|
+
onError: option.onError || (function () { }),
|
|
430
|
+
onSuccess: option.onSuccess || (function () { }),
|
|
431
|
+
onProgress: option.onProgress || (function () { })
|
|
432
|
+
};
|
|
433
|
+
option.onError = callbacks.onError;
|
|
434
|
+
option.onSuccess = callbacks.onSuccess;
|
|
435
|
+
option.onProgress = callbacks.onProgress;
|
|
436
|
+
// 文件类型验证
|
|
437
|
+
if (!isSupportedImageType(file.type)) {
|
|
438
|
+
callbacks.onError('');
|
|
439
|
+
(_a = apiConfig.messageWarning) === null || _a === void 0 ? void 0 : _a.call(apiConfig, '上传失败,请上传后缀为png、gif、jpg的文件');
|
|
440
|
+
return [2 /*return*/, Promise.reject('文件类型不支持')];
|
|
441
|
+
}
|
|
442
|
+
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
443
|
+
var imageType, suffix, extensionName, _a, year, fileName, isSmallImage, quality, isGif, idCard, businessType, client_1, result_1, val, res, res, image, rst, isLong, postFile, imgSize, maxSizeMB, errorMsg, client, result, res, res, clientParams, url, error_1, errorMsg;
|
|
444
|
+
return __generator(this, function (_b) {
|
|
445
|
+
switch (_b.label) {
|
|
446
|
+
case 0:
|
|
447
|
+
_b.trys.push([0, 16, , 17]);
|
|
448
|
+
imageType = option.imageType || DEFAULT_IMAGE_TYPE;
|
|
449
|
+
suffix = exports.SuffixEnum[imageType] || exports.SuffixEnum.official;
|
|
450
|
+
extensionName = ".".concat(file.name.split('.').pop());
|
|
451
|
+
_a = generateFileName(imageType, extensionName), year = _a.year, fileName = _a.fileName;
|
|
452
|
+
isSmallImage = getFileSizeInKB(file.size) <= SMALL_IMAGE_THRESHOLD;
|
|
453
|
+
quality = isSmallImage ? 1 : (option.quality || DEFAULT_QUALITY);
|
|
454
|
+
isGif = file.type === 'image/gif';
|
|
455
|
+
idCard = option.idCard || false;
|
|
456
|
+
businessType = determineBusinessType(option, isGif);
|
|
457
|
+
if (!(businessType === BusinessType.ENCRYPTED)) return [3 /*break*/, 3];
|
|
458
|
+
return [4 /*yield*/, createOssClient(businessType, option.imggeCarType)];
|
|
459
|
+
case 1:
|
|
460
|
+
client_1 = _b.sent();
|
|
461
|
+
return [4 /*yield*/, performOssUpload(client_1, fileName, file, year, file.type, callbacks.onProgress)];
|
|
462
|
+
case 2:
|
|
463
|
+
result_1 = _b.sent();
|
|
464
|
+
if (result_1.res.statusCode === 200) {
|
|
465
|
+
val = __assign(__assign({}, result_1), { imgUrl: "".concat(result_1.bucket, "://").concat(result_1.name), imgOrgUrl: "".concat(result_1.bucket, "://").concat(result_1.name), fileName: file.name });
|
|
466
|
+
callbacks.onSuccess(val);
|
|
467
|
+
resolve(val);
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
callbacks.onError('上传失败');
|
|
471
|
+
reject('上传失败');
|
|
472
|
+
}
|
|
473
|
+
return [2 /*return*/];
|
|
474
|
+
case 3:
|
|
475
|
+
if (!(option.batchTransfer && apiConfig.multiTransferImage)) return [3 /*break*/, 5];
|
|
476
|
+
return [4 /*yield*/, apiConfig.multiTransferImage({ file: file })];
|
|
477
|
+
case 4:
|
|
478
|
+
res = _b.sent();
|
|
479
|
+
if (res.data.code === 0) {
|
|
480
|
+
loadImage({
|
|
481
|
+
url: res.data.data,
|
|
482
|
+
val: res.data,
|
|
483
|
+
suffix: suffix,
|
|
484
|
+
option: option,
|
|
485
|
+
file: file,
|
|
486
|
+
resolve: resolve,
|
|
487
|
+
reject: reject
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
callbacks.onError('上传失败');
|
|
492
|
+
reject('上传失败');
|
|
493
|
+
}
|
|
494
|
+
return [2 /*return*/];
|
|
495
|
+
case 5:
|
|
496
|
+
if (!(option.imageType === 'carport' && apiConfig.darkWaterUploadImage)) return [3 /*break*/, 7];
|
|
497
|
+
return [4 /*yield*/, apiConfig.darkWaterUploadImage({ file: file })];
|
|
498
|
+
case 6:
|
|
499
|
+
res = _b.sent();
|
|
500
|
+
if (res.data.code === 0) {
|
|
501
|
+
loadImage({
|
|
502
|
+
url: res.data.data,
|
|
503
|
+
val: res.data,
|
|
504
|
+
suffix: suffix,
|
|
505
|
+
option: option,
|
|
506
|
+
file: file,
|
|
507
|
+
resolve: resolve,
|
|
508
|
+
reject: reject
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
callbacks.onError('上传失败');
|
|
513
|
+
reject('上传失败');
|
|
514
|
+
}
|
|
515
|
+
return [2 /*return*/];
|
|
516
|
+
case 7: return [4 /*yield*/, imgUpload(file)
|
|
517
|
+
// 图片压缩
|
|
518
|
+
];
|
|
519
|
+
case 8:
|
|
520
|
+
image = _b.sent();
|
|
521
|
+
return [4 /*yield*/, (0, lrz_1.default)(file, { quality: quality })
|
|
522
|
+
// 注释:长图压缩有问题,长宽比>2:1的图片不压缩
|
|
523
|
+
];
|
|
524
|
+
case 9:
|
|
525
|
+
rst = _b.sent();
|
|
526
|
+
isLong = isLongImage(image.width, image.height);
|
|
527
|
+
postFile = void 0;
|
|
528
|
+
if (option.notCompress || isGif || isLong) {
|
|
529
|
+
// 注释:GIF、notCompress选项或长图不压缩
|
|
530
|
+
postFile = file;
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
postFile = rst.file;
|
|
534
|
+
}
|
|
535
|
+
imgSize = postFile.size;
|
|
536
|
+
maxSizeMB = DEFAULT_FILE_SIZE_LIMIT;
|
|
537
|
+
if (getFileSizeInMB(imgSize) > maxSizeMB) {
|
|
538
|
+
errorMsg = "\u56FE\u7247\u4E0D\u80FD\u8D85\u8FC7".concat(maxSizeMB, "M");
|
|
539
|
+
callbacks.onError(errorMsg);
|
|
540
|
+
reject(errorMsg);
|
|
541
|
+
return [2 /*return*/];
|
|
542
|
+
}
|
|
543
|
+
// 设置文件名(确保压缩后的文件有名称)
|
|
544
|
+
if (!postFile.name) {
|
|
545
|
+
Object.defineProperty(postFile, 'name', {
|
|
546
|
+
value: file.name,
|
|
547
|
+
writable: false
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
return [4 /*yield*/, createOssClient(businessType, option.imggeCarType)
|
|
551
|
+
// 执行上传
|
|
552
|
+
];
|
|
553
|
+
case 10:
|
|
554
|
+
client = _b.sent();
|
|
555
|
+
return [4 /*yield*/, performOssUpload(client, fileName, postFile, year, postFile.type, callbacks.onProgress)];
|
|
556
|
+
case 11:
|
|
557
|
+
result = _b.sent();
|
|
558
|
+
if (result.res.statusCode !== 200) {
|
|
559
|
+
callbacks.onError('上传失败');
|
|
560
|
+
reject('上传失败');
|
|
561
|
+
return [2 /*return*/];
|
|
562
|
+
}
|
|
563
|
+
if (!(idCard && apiConfig.generatePrePresignedUrl)) return [3 /*break*/, 13];
|
|
564
|
+
return [4 /*yield*/, apiConfig.generatePrePresignedUrl({
|
|
565
|
+
objectId: result.name,
|
|
566
|
+
expireMils: PRESIGNED_URL_EXPIRE_TIME
|
|
567
|
+
})];
|
|
568
|
+
case 12:
|
|
569
|
+
res = _b.sent();
|
|
570
|
+
if (res.data.code === 0) {
|
|
571
|
+
loadImageNew({
|
|
572
|
+
url: res.data.data,
|
|
573
|
+
val: result,
|
|
574
|
+
file: postFile,
|
|
575
|
+
option: option,
|
|
576
|
+
resolve: resolve,
|
|
577
|
+
reject: reject
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
callbacks.onError('生成预签名URL失败');
|
|
582
|
+
reject('生成预签名URL失败');
|
|
583
|
+
}
|
|
584
|
+
return [2 /*return*/];
|
|
585
|
+
case 13:
|
|
586
|
+
if (!(imageType === 'avatar' && apiConfig.aliyunPersist)) return [3 /*break*/, 15];
|
|
587
|
+
return [4 /*yield*/, apiConfig.aliyunPersist({
|
|
588
|
+
object: "".concat(result.bucket, "://").concat(result.name),
|
|
589
|
+
businessType: BusinessType.AVATAR
|
|
590
|
+
})];
|
|
591
|
+
case 14:
|
|
592
|
+
res = _b.sent();
|
|
593
|
+
if (res.data.code === 0) {
|
|
594
|
+
loadImageNew({
|
|
595
|
+
url: res.data.data,
|
|
596
|
+
val: result,
|
|
597
|
+
file: postFile,
|
|
598
|
+
option: option,
|
|
599
|
+
resolve: resolve,
|
|
600
|
+
reject: reject
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
callbacks.onError('头像处理失败');
|
|
605
|
+
reject('头像处理失败');
|
|
606
|
+
}
|
|
607
|
+
return [2 /*return*/];
|
|
608
|
+
case 15:
|
|
609
|
+
clientParams = client.options;
|
|
610
|
+
url = "".concat(clientParams.realmName).concat(result.name).concat(clientParams.suffix || '');
|
|
611
|
+
loadImage({
|
|
612
|
+
url: url,
|
|
613
|
+
val: result,
|
|
614
|
+
suffix: suffix,
|
|
615
|
+
file: postFile,
|
|
616
|
+
option: option,
|
|
617
|
+
resolve: resolve,
|
|
618
|
+
reject: reject,
|
|
619
|
+
isGif: isGif
|
|
620
|
+
});
|
|
621
|
+
return [3 /*break*/, 17];
|
|
622
|
+
case 16:
|
|
623
|
+
error_1 = _b.sent();
|
|
624
|
+
errorMsg = error_1.message || '上传异常';
|
|
625
|
+
callbacks.onError(errorMsg);
|
|
626
|
+
reject(errorMsg);
|
|
627
|
+
return [3 /*break*/, 17];
|
|
628
|
+
case 17: return [2 /*return*/];
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
}); })];
|
|
632
|
+
});
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* 文件上传方法
|
|
637
|
+
* 支持视频、文档、APK等文件类型
|
|
638
|
+
* @param option 上传选项
|
|
639
|
+
* @returns Promise
|
|
640
|
+
*/
|
|
641
|
+
function ossUploadFile(option) {
|
|
642
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
643
|
+
var file, callbacks;
|
|
644
|
+
var _this = this;
|
|
645
|
+
return __generator(this, function (_a) {
|
|
646
|
+
file = option.file;
|
|
647
|
+
callbacks = {
|
|
648
|
+
onError: option.onError || (function () { }),
|
|
649
|
+
onSuccess: option.onSuccess || (function () { }),
|
|
650
|
+
onProgress: option.onProgress || (function () { })
|
|
651
|
+
};
|
|
652
|
+
option.onError = callbacks.onError;
|
|
653
|
+
option.onSuccess = callbacks.onSuccess;
|
|
654
|
+
option.onProgress = callbacks.onProgress;
|
|
655
|
+
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
656
|
+
var extensionName, fileType, _a, year, fileName, isVideo, isDocument, isUnProtect, businessType, client, result, clientParams, url, uploadResult, error_2, errorMsg;
|
|
657
|
+
return __generator(this, function (_b) {
|
|
658
|
+
switch (_b.label) {
|
|
659
|
+
case 0:
|
|
660
|
+
_b.trys.push([0, 5, , 6]);
|
|
661
|
+
extensionName = ".".concat(file.name.split('.').pop());
|
|
662
|
+
fileType = extensionName === '.apk' ? 'apk' : 'file';
|
|
663
|
+
_a = generateFileName(fileType, extensionName), year = _a.year, fileName = _a.fileName;
|
|
664
|
+
isVideo = !!option.isVideo;
|
|
665
|
+
isDocument = !!option.isDocument;
|
|
666
|
+
isUnProtect = !!option.isUnProtect;
|
|
667
|
+
businessType = option.businessType;
|
|
668
|
+
if (!businessType) {
|
|
669
|
+
if (isUnProtect) {
|
|
670
|
+
businessType = BusinessType.UNPROTECT;
|
|
671
|
+
}
|
|
672
|
+
else if (isVideo || isDocument) {
|
|
673
|
+
businessType = BusinessType.VIDEO; // 视频和文档都使用6
|
|
674
|
+
}
|
|
675
|
+
else {
|
|
676
|
+
businessType = BusinessType.DEFAULT;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
if (!(isDocument && apiConfig.uploadConf)) return [3 /*break*/, 2];
|
|
680
|
+
return [4 /*yield*/, apiConfig.uploadConf(businessType)];
|
|
681
|
+
case 1:
|
|
682
|
+
_b.sent();
|
|
683
|
+
_b.label = 2;
|
|
684
|
+
case 2: return [4 /*yield*/, createOssClient(businessType, option.imggeCarType)
|
|
685
|
+
// 执行上传
|
|
686
|
+
];
|
|
687
|
+
case 3:
|
|
688
|
+
client = _b.sent();
|
|
689
|
+
return [4 /*yield*/, performOssUpload(client, fileName, file, year, file.type, callbacks.onProgress)];
|
|
690
|
+
case 4:
|
|
691
|
+
result = _b.sent();
|
|
692
|
+
if (result.res.statusCode === 200) {
|
|
693
|
+
clientParams = client.options;
|
|
694
|
+
url = "".concat(clientParams.realmName).concat(result.name).concat(clientParams.suffix || '');
|
|
695
|
+
uploadResult = __assign(__assign({}, result), { url: url, fileName: file.name });
|
|
696
|
+
callbacks.onSuccess(uploadResult);
|
|
697
|
+
resolve(uploadResult);
|
|
698
|
+
}
|
|
699
|
+
else {
|
|
700
|
+
callbacks.onError('上传失败');
|
|
701
|
+
reject('上传失败');
|
|
702
|
+
}
|
|
703
|
+
return [3 /*break*/, 6];
|
|
704
|
+
case 5:
|
|
705
|
+
error_2 = _b.sent();
|
|
706
|
+
errorMsg = error_2.message || '上传异常';
|
|
707
|
+
callbacks.onError(errorMsg);
|
|
708
|
+
reject(errorMsg);
|
|
709
|
+
return [3 /*break*/, 6];
|
|
710
|
+
case 6: return [2 /*return*/];
|
|
711
|
+
}
|
|
712
|
+
});
|
|
713
|
+
}); })];
|
|
714
|
+
});
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
/**
|
|
718
|
+
* 商品详情图片上传
|
|
719
|
+
* 注释:此方法用于商品详情页的图片上传,不压缩,使用NoWater客户端
|
|
720
|
+
* @param option 上传选项
|
|
721
|
+
* @returns Promise
|
|
722
|
+
*/
|
|
723
|
+
function shopDetailUpdate(option) {
|
|
724
|
+
var _a;
|
|
725
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
726
|
+
var file, callbacks;
|
|
727
|
+
var _this = this;
|
|
728
|
+
return __generator(this, function (_b) {
|
|
729
|
+
file = option.file;
|
|
730
|
+
callbacks = {
|
|
731
|
+
onError: option.onError || (function () { }),
|
|
732
|
+
onSuccess: option.onSuccess || (function () { }),
|
|
733
|
+
onProgress: option.onProgress || (function () { })
|
|
734
|
+
};
|
|
735
|
+
option.onError = callbacks.onError;
|
|
736
|
+
option.onSuccess = callbacks.onSuccess;
|
|
737
|
+
option.onProgress = callbacks.onProgress;
|
|
738
|
+
// 文件类型验证
|
|
739
|
+
if (!isSupportedImageType(file.type)) {
|
|
740
|
+
callbacks.onError('');
|
|
741
|
+
(_a = apiConfig.messageWarning) === null || _a === void 0 ? void 0 : _a.call(apiConfig, '上传失败,请上传后缀为png、gif、jpg的文件');
|
|
742
|
+
return [2 /*return*/, Promise.reject('文件类型不支持')];
|
|
743
|
+
}
|
|
744
|
+
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
745
|
+
var errorMsg, imageType, suffix, extensionName, _a, year, fileName, client, result, clientParams, url, error_3, errorMsg;
|
|
746
|
+
return __generator(this, function (_b) {
|
|
747
|
+
switch (_b.label) {
|
|
748
|
+
case 0:
|
|
749
|
+
_b.trys.push([0, 4, , 5]);
|
|
750
|
+
// 文件大小验证
|
|
751
|
+
if (getFileSizeInMB(file.size) > DEFAULT_FILE_SIZE_LIMIT) {
|
|
752
|
+
errorMsg = "\u56FE\u7247\u4E0D\u80FD\u8D85\u8FC7".concat(DEFAULT_FILE_SIZE_LIMIT, "M");
|
|
753
|
+
callbacks.onError(errorMsg);
|
|
754
|
+
reject(errorMsg);
|
|
755
|
+
return [2 /*return*/];
|
|
756
|
+
}
|
|
757
|
+
// 预加载图片(虽然不需要尺寸,但保持原有逻辑)
|
|
758
|
+
return [4 /*yield*/, imgUpload(file)];
|
|
759
|
+
case 1:
|
|
760
|
+
// 预加载图片(虽然不需要尺寸,但保持原有逻辑)
|
|
761
|
+
_b.sent();
|
|
762
|
+
imageType = option.imageType || DEFAULT_IMAGE_TYPE;
|
|
763
|
+
suffix = exports.SuffixEnum[imageType] || exports.SuffixEnum.official;
|
|
764
|
+
extensionName = ".".concat(file.name.split('.').pop());
|
|
765
|
+
_a = generateFileName(imageType, extensionName), year = _a.year, fileName = _a.fileName;
|
|
766
|
+
return [4 /*yield*/, createOssClient(BusinessType.NO_WATER, option.imggeCarType)
|
|
767
|
+
// 执行上传
|
|
768
|
+
];
|
|
769
|
+
case 2:
|
|
770
|
+
client = _b.sent();
|
|
771
|
+
return [4 /*yield*/, performOssUpload(client, fileName, file, year, file.type, callbacks.onProgress)];
|
|
772
|
+
case 3:
|
|
773
|
+
result = _b.sent();
|
|
774
|
+
if (result.res.statusCode === 200) {
|
|
775
|
+
clientParams = client.options;
|
|
776
|
+
url = "".concat(clientParams.realmName).concat(result.name).concat(clientParams.suffix || '');
|
|
777
|
+
loadImage({
|
|
778
|
+
url: url,
|
|
779
|
+
val: result,
|
|
780
|
+
suffix: suffix,
|
|
781
|
+
file: file,
|
|
782
|
+
option: option,
|
|
783
|
+
resolve: resolve,
|
|
784
|
+
reject: reject
|
|
785
|
+
});
|
|
786
|
+
}
|
|
787
|
+
else {
|
|
788
|
+
callbacks.onError('上传失败');
|
|
789
|
+
reject('上传失败');
|
|
790
|
+
}
|
|
791
|
+
return [3 /*break*/, 5];
|
|
792
|
+
case 4:
|
|
793
|
+
error_3 = _b.sent();
|
|
794
|
+
errorMsg = error_3.message || '上传异常';
|
|
795
|
+
callbacks.onError(errorMsg);
|
|
796
|
+
reject(errorMsg);
|
|
797
|
+
return [3 /*break*/, 5];
|
|
798
|
+
case 5: return [2 /*return*/];
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
}); })];
|
|
802
|
+
});
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
// 返回上传器实例
|
|
806
|
+
return {
|
|
807
|
+
/**
|
|
808
|
+
* 图片上传
|
|
809
|
+
* @param option 上传选项
|
|
810
|
+
*/
|
|
811
|
+
ossUploadImage: ossUploadImage,
|
|
812
|
+
/**
|
|
813
|
+
* 文件上传(视频、文档、APK等)
|
|
814
|
+
* @param option 上传选项
|
|
815
|
+
*/
|
|
816
|
+
ossUploadFile: ossUploadFile,
|
|
817
|
+
/**
|
|
818
|
+
* 商品详情图片上传
|
|
819
|
+
* @param option 上传选项
|
|
820
|
+
*/
|
|
821
|
+
shopDetailUpdate: shopDetailUpdate,
|
|
822
|
+
/**
|
|
823
|
+
* 后缀枚举
|
|
824
|
+
*/
|
|
825
|
+
suffixEnum: exports.SuffixEnum,
|
|
826
|
+
/**
|
|
827
|
+
* 业务类型枚举
|
|
828
|
+
*/
|
|
829
|
+
businessType: BusinessType,
|
|
830
|
+
/**
|
|
831
|
+
* 生成随机字符串
|
|
832
|
+
* @param num 字符串长度
|
|
833
|
+
*/
|
|
834
|
+
randomString: randomString,
|
|
835
|
+
/**
|
|
836
|
+
* 创建OSS客户端(高级用法)
|
|
837
|
+
* @param businessType 业务类型
|
|
838
|
+
* @param imggeCarType 车辆图片类型
|
|
839
|
+
*/
|
|
840
|
+
createOssClient: createOssClient,
|
|
841
|
+
/**
|
|
842
|
+
* 预加载图片
|
|
843
|
+
* @param file 文件对象
|
|
844
|
+
*/
|
|
845
|
+
imgUpload: imgUpload,
|
|
846
|
+
/**
|
|
847
|
+
* 加载图片并返回结果
|
|
848
|
+
*/
|
|
849
|
+
loadImage: loadImage,
|
|
850
|
+
/**
|
|
851
|
+
* 加载图片并返回结果(新版)
|
|
852
|
+
*/
|
|
853
|
+
loadImageNew: loadImageNew
|
|
854
|
+
};
|
|
855
|
+
}
|
|
856
|
+
exports.createAliOssUploader = createAliOssUploader;
|
|
857
|
+
/**
|
|
858
|
+
* 默认导出
|
|
859
|
+
*/
|
|
860
|
+
exports.default = {
|
|
861
|
+
createAliOssUploader: createAliOssUploader,
|
|
862
|
+
BusinessType: BusinessType,
|
|
863
|
+
SuffixEnum: exports.SuffixEnum
|
|
864
|
+
};
|