sa2kit 1.6.27 → 1.6.29

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.
@@ -0,0 +1,6 @@
1
+ export { AliyunOSSProvider } from './chunk-WSNM4EU5.mjs';
2
+ import './chunk-ZGVB35L2.mjs';
3
+ import './chunk-KQGP6BTS.mjs';
4
+ import './chunk-BJTO5JO5.mjs';
5
+ //# sourceMappingURL=AliyunOSSProvider-I7I5YGLB.mjs.map
6
+ //# sourceMappingURL=AliyunOSSProvider-I7I5YGLB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-YKT256D6.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-I7I5YGLB.mjs"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var chunk5GCHAXY5_js = require('./chunk-5GCHAXY5.js');
4
+ require('./chunk-KH6RQ4J5.js');
5
+ require('./chunk-6PRFP5EG.js');
6
+ require('./chunk-DGUM43GV.js');
7
+
8
+
9
+
10
+ Object.defineProperty(exports, "AliyunOSSProvider", {
11
+ enumerable: true,
12
+ get: function () { return chunk5GCHAXY5_js.AliyunOSSProvider; }
13
+ });
14
+ //# sourceMappingURL=AliyunOSSProvider-L7JWMKS4.js.map
15
+ //# sourceMappingURL=AliyunOSSProvider-L7JWMKS4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-KOVWJQLL.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-L7JWMKS4.js"}
@@ -92,9 +92,7 @@ var AliyunOSSProvider = class {
92
92
  logger.info(`\u2705 [AliyunOSSProvider] \u963F\u91CC\u4E91OSS${configChanged ? "\u91CD\u65B0" : ""}\u521D\u59CB\u5316\u5B8C\u6210`);
93
93
  } catch (error) {
94
94
  logger.error("\u274C [AliyunOSSProvider] \u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25:", error);
95
- throw new chunkKH6RQ4J5_js.StorageProviderError(
96
- `\u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`
97
- );
95
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25`);
98
96
  }
99
97
  }
100
98
  /**
@@ -134,7 +132,7 @@ var AliyunOSSProvider = class {
134
132
  logger.info(
135
133
  `\u{1F4E4} [AliyunOSSProvider] \u4F7F\u7528\u666E\u901A\u4E0A\u4F20: ${filePath}, \u5927\u5C0F: ${fileInfo.file.size}`
136
134
  );
137
- result = await this.client.put(filePath, buffer, options);
135
+ result = await this.client?.put(filePath, buffer, options);
138
136
  }
139
137
  const accessUrl = this.generateAccessUrl(filePath);
140
138
  const uploadTime = Date.now() - startTime;
@@ -166,7 +164,7 @@ var AliyunOSSProvider = class {
166
164
  this.ensureInitialized();
167
165
  logger.info(`\u{1F4E5} [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u4E0B\u8F7D\u6587\u4EF6: ${filePath}`);
168
166
  try {
169
- const result = await this.client.get(filePath);
167
+ const result = await this.client?.get(filePath);
170
168
  if (!result.content || !Buffer.isBuffer(result.content)) {
171
169
  throw new chunkKH6RQ4J5_js.StorageProviderError("\u4E0B\u8F7D\u7684\u6587\u4EF6\u5185\u5BB9\u683C\u5F0F\u9519\u8BEF");
172
170
  }
@@ -177,9 +175,9 @@ var AliyunOSSProvider = class {
177
175
  } catch (error) {
178
176
  logger.error(`\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: ${filePath}:`, error);
179
177
  if (this.isOSSError(error) && error.code === "NoSuchKey") {
180
- throw new chunkKH6RQ4J5_js.StorageProviderError(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${filePath}`);
178
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u6587\u4EF6\u4E0D\u5B58\u5728`);
181
179
  }
182
- throw new chunkKH6RQ4J5_js.StorageProviderError(`\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: ${this.formatOSSError(error)}`);
180
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25`);
183
181
  }
184
182
  }
185
183
  /**
@@ -189,12 +187,12 @@ var AliyunOSSProvider = class {
189
187
  this.ensureInitialized();
190
188
  logger.info(`\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u5220\u9664\u6587\u4EF6: ${filePath}`);
191
189
  try {
192
- const result = await this.client.delete(filePath);
190
+ const result = await this.client?.delete(filePath);
193
191
  logger.info(`\u2705 [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5B8C\u6210: ${filePath}`);
194
192
  return {
195
193
  success: true,
196
194
  data: {
197
- requestId: result.res?.rt || 0,
195
+ requestId: result?.res?.rt || 0,
198
196
  deletedPath: filePath
199
197
  }
200
198
  };
@@ -219,7 +217,7 @@ var AliyunOSSProvider = class {
219
217
  async getFileInfo(filePath) {
220
218
  this.ensureInitialized();
221
219
  try {
222
- const result = await this.client.head(filePath);
220
+ const result = await this.client?.head(filePath);
223
221
  return {
224
222
  success: true,
225
223
  size: parseInt(String(result.meta["content-length"] || "0")),
@@ -255,15 +253,15 @@ var AliyunOSSProvider = class {
255
253
  return this.generateAccessUrl(filePath);
256
254
  } else {
257
255
  const expires = expiresIn || 3600;
258
- const signedUrl = this.client.signatureUrl(filePath, {
256
+ const signedUrl = this.client?.signatureUrl(filePath, {
259
257
  expires,
260
258
  method: "GET"
261
259
  });
262
- return signedUrl;
260
+ return signedUrl || "";
263
261
  }
264
262
  } catch (error) {
265
263
  logger.error(`\u274C [AliyunOSSProvider] \u751F\u6210\u8BBF\u95EEURL\u5931\u8D25: ${filePath}:`, error);
266
- throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u8BBF\u95EEURL\u5931\u8D25: ${this.formatOSSError(error)}`);
264
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u8BBF\u95EEURL\u5931\u8D25`);
267
265
  }
268
266
  }
269
267
  /**
@@ -273,14 +271,14 @@ var AliyunOSSProvider = class {
273
271
  this.ensureInitialized();
274
272
  try {
275
273
  const expires = expiresIn || 3600;
276
- const signedUrl = this.client.signatureUrl(filePath, {
274
+ const signedUrl = this.client?.signatureUrl(filePath, {
277
275
  expires,
278
276
  method: "PUT"
279
277
  });
280
- return signedUrl;
278
+ return signedUrl || "";
281
279
  } catch (error) {
282
280
  logger.error(`\u274C [AliyunOSSProvider] \u751F\u6210\u4E0A\u4F20URL\u5931\u8D25: ${filePath}:`, error);
283
- throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u4E0A\u4F20URL\u5931\u8D25: ${this.formatOSSError(error)}`);
281
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u4E0A\u4F20URL\u5931\u8D25`);
284
282
  }
285
283
  }
286
284
  /**
@@ -289,7 +287,7 @@ var AliyunOSSProvider = class {
289
287
  async exists(filePath) {
290
288
  this.ensureInitialized();
291
289
  try {
292
- await this.client.head(filePath);
290
+ await this.client?.head(filePath);
293
291
  return true;
294
292
  } catch (error) {
295
293
  if (this.isOSSError(error) && error.code === "NoSuchKey") {
@@ -310,7 +308,7 @@ var AliyunOSSProvider = class {
310
308
  delimiter,
311
309
  "max-keys": String(maxKeys)
312
310
  };
313
- const result = await this.client.list(options);
311
+ const result = await this.client?.list(options, {});
314
312
  const files = (result.objects || []).map((obj) => ({
315
313
  name: obj.name,
316
314
  url: this.generateAccessUrl(obj.name),
@@ -327,7 +325,7 @@ var AliyunOSSProvider = class {
327
325
  };
328
326
  } catch (error) {
329
327
  logger.error(`\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${prefix}:`, error);
330
- throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${this.formatOSSError(error)}`);
328
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25`);
331
329
  }
332
330
  }
333
331
  /**
@@ -340,7 +338,7 @@ var AliyunOSSProvider = class {
340
338
  prefix,
341
339
  "max-keys": String(maxKeys || 1e3)
342
340
  };
343
- const result = await this.client.list(options);
341
+ const result = await this.client?.list(options, {});
344
342
  return result.objects?.map((obj) => obj.name) || [];
345
343
  } catch (error) {
346
344
  logger.error(`\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${prefix}:`, error);
@@ -366,7 +364,7 @@ var AliyunOSSProvider = class {
366
364
  const required = ["region", "bucket", "accessKeyId", "accessKeySecret"];
367
365
  const missing = required.filter((key) => !this.config[key]);
368
366
  if (missing.length > 0) {
369
- throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u9879: ${missing.join(", ")}`);
367
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u9879`);
370
368
  }
371
369
  }
372
370
  /**
@@ -374,9 +372,9 @@ var AliyunOSSProvider = class {
374
372
  */
375
373
  async testConnection() {
376
374
  try {
377
- await this.client.list({
375
+ await this.client?.list({
378
376
  "max-keys": "1"
379
- });
377
+ }, {});
380
378
  logger.info(`\u2705 [AliyunOSSProvider] OSS\u8FDE\u63A5\u6D4B\u8BD5\u6210\u529F`);
381
379
  } catch (error) {
382
380
  logger.error("\u274C [AliyunOSSProvider] OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25\uFF0C\u539F\u59CB\u9519\u8BEF:", error);
@@ -391,16 +389,16 @@ var AliyunOSSProvider = class {
391
389
  }
392
390
  if (typeof errorCode === "string") {
393
391
  if (errorCode === "NoSuchBucket") {
394
- throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5B58\u50A8\u6876\u4E0D\u5B58\u5728: ${this.config.bucket}`);
392
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5B58\u50A8\u6876\u4E0D\u5B58\u5728`);
395
393
  } else if (errorCode === "InvalidAccessKeyId") {
396
394
  throw new chunkKH6RQ4J5_js.StorageProviderError("Access Key ID \u65E0\u6548");
397
395
  } else if (errorCode === "SignatureDoesNotMatch") {
398
396
  throw new chunkKH6RQ4J5_js.StorageProviderError("Access Key Secret \u65E0\u6548");
399
397
  } else {
400
- throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25: ${errorCode} - ${errorMessage}`);
398
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25`);
401
399
  }
402
400
  }
403
- throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25: ${errorMessage}`);
401
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25`);
404
402
  }
405
403
  }
406
404
  /**
@@ -408,7 +406,7 @@ var AliyunOSSProvider = class {
408
406
  */
409
407
  async multipartUpload(filePath, buffer, options) {
410
408
  logger.info(`\u{1F4E6} [AliyunOSSProvider] \u4F7F\u7528\u591A\u5206\u7247\u4E0A\u4F20`);
411
- const result = await this.client.multipartUpload(filePath, buffer, {
409
+ const result = await this.client?.multipartUpload(filePath, buffer, {
412
410
  partSize: 10 * 1024 * 1024,
413
411
  // 10MB per chunk
414
412
  parallel: 4,
@@ -422,11 +420,11 @@ var AliyunOSSProvider = class {
422
420
  headers: options.headers
423
421
  });
424
422
  return {
425
- name: result.name,
426
- url: result.name,
423
+ name: result?.name || "",
424
+ url: result?.name || "",
427
425
  // OSS返回的是object名称
428
- data: result.data,
429
- res: result.res
426
+ data: result?.data || {},
427
+ res: result?.res || {}
430
428
  };
431
429
  }
432
430
  /**
@@ -492,7 +490,7 @@ var AliyunOSSProvider = class {
492
490
  if (contentLength) {
493
491
  options.headers["Content-Length"] = contentLength.toString();
494
492
  }
495
- const result = await this.client.putStream(filePath, readableStream, options);
493
+ const result = await this.client?.putStream(filePath, readableStream, options);
496
494
  const accessUrl = this.generateAccessUrl(filePath);
497
495
  const uploadTime = Date.now() - startTime;
498
496
  logger.info(`\u2705 [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5B8C\u6210: ${filePath}, \u8017\u65F6: ${uploadTime}ms`);
@@ -523,7 +521,7 @@ var AliyunOSSProvider = class {
523
521
  this.ensureInitialized();
524
522
  logger.info(`\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u6279\u91CF\u5220\u9664\u6587\u4EF6\uFF0C\u6570\u91CF: ${filePaths.length}`);
525
523
  try {
526
- const result = await this.client.deleteMulti(filePaths, {
524
+ const result = await this.client?.deleteMulti(filePaths, {
527
525
  quiet: false
528
526
  // 返回删除结果
529
527
  });
@@ -550,7 +548,7 @@ var AliyunOSSProvider = class {
550
548
  this.ensureInitialized();
551
549
  logger.info(`\u{1F4CB} [AliyunOSSProvider] \u5F00\u59CB\u590D\u5236\u6587\u4EF6: ${sourcePath} -> ${targetPath}`);
552
550
  try {
553
- const result = await this.client.copy(targetPath, sourcePath);
551
+ const result = await this.client?.copy(targetPath, sourcePath);
554
552
  logger.info(`\u2705 [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5B8C\u6210: ${sourcePath} -> ${targetPath}`);
555
553
  return {
556
554
  success: true,
@@ -584,5 +582,5 @@ var AliyunOSSProvider = class {
584
582
  };
585
583
 
586
584
  exports.AliyunOSSProvider = AliyunOSSProvider;
587
- //# sourceMappingURL=chunk-BLQRF7C7.js.map
588
- //# sourceMappingURL=chunk-BLQRF7C7.js.map
585
+ //# sourceMappingURL=chunk-5GCHAXY5.js.map
586
+ //# sourceMappingURL=chunk-5GCHAXY5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/universalFile/server/providers/AliyunOSSProvider.ts"],"names":["createLogger","StorageProviderError","OSS"],"mappings":"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","file":"chunk-5GCHAXY5.js","sourcesContent":["/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: OSS | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n `☁️ [AliyunOSSProvider] 新配置: bucket=${newConfig.bucket}, region=${newConfig.region}`\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info(`☁️ [AliyunOSSProvider] ${this.isInitialized ? '重新' : ''}初始化阿里云OSS`);\n logger.info(`☁️ [AliyunOSSProvider] ${this.config ? JSON.stringify(this.config) : ''}`);\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n logger.info(`☁️ [AliyunOSSProvider] 测试连接... testConnection`);\n\n // 测试连接\n await this.testConnection();\n\n this.isInitialized = true;\n logger.info(`✅ [AliyunOSSProvider] 阿里云OSS${configChanged ? '重新' : ''}初始化完成`);\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(`阿里云OSS初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始上传文件到OSS: ${filePath}`);\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n `📦 [AliyunOSSProvider] 使用分片上传大文件: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n `📤 [AliyunOSSProvider] 使用普通上传: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.client?.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 文件上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info(`📥 [AliyunOSSProvider] 开始从OSS下载文件: ${filePath}`);\n\n try {\n const result = await this.client?.get(filePath) as any;\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n `✅ [AliyunOSSProvider] 文件下载完成: ${filePath}, 大小: ${result.content.length}`\n );\n\n return result.content;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件下载失败: ${filePath}:`, error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在`);\n }\n\n throw new StorageProviderError(`文件下载失败`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ${filePath}`);\n\n try {\n const result = await this.client?.delete(filePath) as any;\n\n logger.info(`✅ [AliyunOSSProvider] 文件删除完成: ${filePath}`);\n\n return {\n success: true,\n data: {\n requestId: result?.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件删除失败: ${filePath}:`, error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn(`⚠️ [AliyunOSSProvider] 文件不存在: ${filePath}`);\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client?.head(filePath) as any;\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl || '' ;\n }\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成访问URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成访问URL失败`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl || '' ;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成上传URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成上传URL失败`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client?.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn(`⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ${filePath}:`, error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n throw new StorageProviderError(`列出文件失败`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n try {\n // 尝试列出少量对象来测试连接\n await this.client?.list({\n 'max-keys': '1',\n }, {}) as any;\n logger.info(`✅ [AliyunOSSProvider] OSS连接测试成功`);\n } catch (error: any) {\n logger.error('❌ [AliyunOSSProvider] OSS连接测试失败,原始错误:', error);\n\n // 安全地检查错误类型,避免生产环境中的压缩问题\n let errorCode: string | undefined;\n let errorMessage: string = '未知错误';\n\n try {\n errorCode = error?.code;\n errorMessage = error?.message || '未知错误';\n } catch (accessError) {\n // 如果访问错误属性失败,使用通用错误信息\n logger.warn('无法访问错误对象的属性:', accessError);\n errorMessage = '无法解析错误信息';\n }\n\n if (typeof errorCode === 'string') {\n if (errorCode === 'NoSuchBucket') {\n throw new StorageProviderError(`存储桶不存在`);\n }\n else if (errorCode === 'InvalidAccessKeyId') {\n throw new StorageProviderError('Access Key ID 无效');\n }\n else if (errorCode === 'SignatureDoesNotMatch') {\n throw new StorageProviderError('Access Key Secret 无效');\n }\n else {\n throw new StorageProviderError(`OSS连接测试失败`);\n }\n }\n\n // 如果不是标准的OSS错误,抛出通用错误\n throw new StorageProviderError(`OSS连接测试失败`);\n }\n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client?.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info(`📦 [AliyunOSSProvider] 上传进度: ${(p * 100).toFixed(1)}%`);\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result?.name || '',\n url: result?.name || '', // OSS返回的是object名称\n data: result?.data || {},\n res: result?.res || {},\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.customDomain}/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用自定义域名: ${url}`);\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.bucket}.${this.config.region}.aliyuncs.com/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用默认OSS域名: ${url}`);\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n if (this.isOSSError(error)) {\n const requestId = error.requestId ? ` (RequestId: ${error.requestId})` : '';\n return `${error.code}: ${error.message}${requestId}`;\n }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ${filePath}`);\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client?.putStream(filePath, readableStream, options) as any;\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 流式上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 流式上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ${filePaths.length}`);\n\n try {\n const result = await this.client?.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n }) as any;\n\n logger.info(`✅ [AliyunOSSProvider] 批量删除完成,成功: ${result.deleted?.length || 0}`);\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`📋 [AliyunOSSProvider] 开始复制文件: ${sourcePath} -> ${targetPath}`);\n\n try {\n const result = await this.client?.copy(targetPath, sourcePath) as any;\n\n logger.info(`✅ [AliyunOSSProvider] 文件复制完成: ${sourcePath} -> ${targetPath}`);\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件复制失败: ${sourcePath} -> ${targetPath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n"]}
@@ -86,9 +86,7 @@ var AliyunOSSProvider = class {
86
86
  logger.info(`\u2705 [AliyunOSSProvider] \u963F\u91CC\u4E91OSS${configChanged ? "\u91CD\u65B0" : ""}\u521D\u59CB\u5316\u5B8C\u6210`);
87
87
  } catch (error) {
88
88
  logger.error("\u274C [AliyunOSSProvider] \u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25:", error);
89
- throw new StorageProviderError(
90
- `\u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`
91
- );
89
+ throw new StorageProviderError(`\u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25`);
92
90
  }
93
91
  }
94
92
  /**
@@ -128,7 +126,7 @@ var AliyunOSSProvider = class {
128
126
  logger.info(
129
127
  `\u{1F4E4} [AliyunOSSProvider] \u4F7F\u7528\u666E\u901A\u4E0A\u4F20: ${filePath}, \u5927\u5C0F: ${fileInfo.file.size}`
130
128
  );
131
- result = await this.client.put(filePath, buffer, options);
129
+ result = await this.client?.put(filePath, buffer, options);
132
130
  }
133
131
  const accessUrl = this.generateAccessUrl(filePath);
134
132
  const uploadTime = Date.now() - startTime;
@@ -160,7 +158,7 @@ var AliyunOSSProvider = class {
160
158
  this.ensureInitialized();
161
159
  logger.info(`\u{1F4E5} [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u4E0B\u8F7D\u6587\u4EF6: ${filePath}`);
162
160
  try {
163
- const result = await this.client.get(filePath);
161
+ const result = await this.client?.get(filePath);
164
162
  if (!result.content || !Buffer.isBuffer(result.content)) {
165
163
  throw new StorageProviderError("\u4E0B\u8F7D\u7684\u6587\u4EF6\u5185\u5BB9\u683C\u5F0F\u9519\u8BEF");
166
164
  }
@@ -171,9 +169,9 @@ var AliyunOSSProvider = class {
171
169
  } catch (error) {
172
170
  logger.error(`\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: ${filePath}:`, error);
173
171
  if (this.isOSSError(error) && error.code === "NoSuchKey") {
174
- throw new StorageProviderError(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${filePath}`);
172
+ throw new StorageProviderError(`\u6587\u4EF6\u4E0D\u5B58\u5728`);
175
173
  }
176
- throw new StorageProviderError(`\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: ${this.formatOSSError(error)}`);
174
+ throw new StorageProviderError(`\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25`);
177
175
  }
178
176
  }
179
177
  /**
@@ -183,12 +181,12 @@ var AliyunOSSProvider = class {
183
181
  this.ensureInitialized();
184
182
  logger.info(`\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u5220\u9664\u6587\u4EF6: ${filePath}`);
185
183
  try {
186
- const result = await this.client.delete(filePath);
184
+ const result = await this.client?.delete(filePath);
187
185
  logger.info(`\u2705 [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5B8C\u6210: ${filePath}`);
188
186
  return {
189
187
  success: true,
190
188
  data: {
191
- requestId: result.res?.rt || 0,
189
+ requestId: result?.res?.rt || 0,
192
190
  deletedPath: filePath
193
191
  }
194
192
  };
@@ -213,7 +211,7 @@ var AliyunOSSProvider = class {
213
211
  async getFileInfo(filePath) {
214
212
  this.ensureInitialized();
215
213
  try {
216
- const result = await this.client.head(filePath);
214
+ const result = await this.client?.head(filePath);
217
215
  return {
218
216
  success: true,
219
217
  size: parseInt(String(result.meta["content-length"] || "0")),
@@ -249,15 +247,15 @@ var AliyunOSSProvider = class {
249
247
  return this.generateAccessUrl(filePath);
250
248
  } else {
251
249
  const expires = expiresIn || 3600;
252
- const signedUrl = this.client.signatureUrl(filePath, {
250
+ const signedUrl = this.client?.signatureUrl(filePath, {
253
251
  expires,
254
252
  method: "GET"
255
253
  });
256
- return signedUrl;
254
+ return signedUrl || "";
257
255
  }
258
256
  } catch (error) {
259
257
  logger.error(`\u274C [AliyunOSSProvider] \u751F\u6210\u8BBF\u95EEURL\u5931\u8D25: ${filePath}:`, error);
260
- throw new StorageProviderError(`\u751F\u6210\u8BBF\u95EEURL\u5931\u8D25: ${this.formatOSSError(error)}`);
258
+ throw new StorageProviderError(`\u751F\u6210\u8BBF\u95EEURL\u5931\u8D25`);
261
259
  }
262
260
  }
263
261
  /**
@@ -267,14 +265,14 @@ var AliyunOSSProvider = class {
267
265
  this.ensureInitialized();
268
266
  try {
269
267
  const expires = expiresIn || 3600;
270
- const signedUrl = this.client.signatureUrl(filePath, {
268
+ const signedUrl = this.client?.signatureUrl(filePath, {
271
269
  expires,
272
270
  method: "PUT"
273
271
  });
274
- return signedUrl;
272
+ return signedUrl || "";
275
273
  } catch (error) {
276
274
  logger.error(`\u274C [AliyunOSSProvider] \u751F\u6210\u4E0A\u4F20URL\u5931\u8D25: ${filePath}:`, error);
277
- throw new StorageProviderError(`\u751F\u6210\u4E0A\u4F20URL\u5931\u8D25: ${this.formatOSSError(error)}`);
275
+ throw new StorageProviderError(`\u751F\u6210\u4E0A\u4F20URL\u5931\u8D25`);
278
276
  }
279
277
  }
280
278
  /**
@@ -283,7 +281,7 @@ var AliyunOSSProvider = class {
283
281
  async exists(filePath) {
284
282
  this.ensureInitialized();
285
283
  try {
286
- await this.client.head(filePath);
284
+ await this.client?.head(filePath);
287
285
  return true;
288
286
  } catch (error) {
289
287
  if (this.isOSSError(error) && error.code === "NoSuchKey") {
@@ -304,7 +302,7 @@ var AliyunOSSProvider = class {
304
302
  delimiter,
305
303
  "max-keys": String(maxKeys)
306
304
  };
307
- const result = await this.client.list(options);
305
+ const result = await this.client?.list(options, {});
308
306
  const files = (result.objects || []).map((obj) => ({
309
307
  name: obj.name,
310
308
  url: this.generateAccessUrl(obj.name),
@@ -321,7 +319,7 @@ var AliyunOSSProvider = class {
321
319
  };
322
320
  } catch (error) {
323
321
  logger.error(`\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${prefix}:`, error);
324
- throw new StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${this.formatOSSError(error)}`);
322
+ throw new StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25`);
325
323
  }
326
324
  }
327
325
  /**
@@ -334,7 +332,7 @@ var AliyunOSSProvider = class {
334
332
  prefix,
335
333
  "max-keys": String(maxKeys || 1e3)
336
334
  };
337
- const result = await this.client.list(options);
335
+ const result = await this.client?.list(options, {});
338
336
  return result.objects?.map((obj) => obj.name) || [];
339
337
  } catch (error) {
340
338
  logger.error(`\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${prefix}:`, error);
@@ -360,7 +358,7 @@ var AliyunOSSProvider = class {
360
358
  const required = ["region", "bucket", "accessKeyId", "accessKeySecret"];
361
359
  const missing = required.filter((key) => !this.config[key]);
362
360
  if (missing.length > 0) {
363
- throw new StorageProviderError(`OSS\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u9879: ${missing.join(", ")}`);
361
+ throw new StorageProviderError(`OSS\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u9879`);
364
362
  }
365
363
  }
366
364
  /**
@@ -368,9 +366,9 @@ var AliyunOSSProvider = class {
368
366
  */
369
367
  async testConnection() {
370
368
  try {
371
- await this.client.list({
369
+ await this.client?.list({
372
370
  "max-keys": "1"
373
- });
371
+ }, {});
374
372
  logger.info(`\u2705 [AliyunOSSProvider] OSS\u8FDE\u63A5\u6D4B\u8BD5\u6210\u529F`);
375
373
  } catch (error) {
376
374
  logger.error("\u274C [AliyunOSSProvider] OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25\uFF0C\u539F\u59CB\u9519\u8BEF:", error);
@@ -385,16 +383,16 @@ var AliyunOSSProvider = class {
385
383
  }
386
384
  if (typeof errorCode === "string") {
387
385
  if (errorCode === "NoSuchBucket") {
388
- throw new StorageProviderError(`\u5B58\u50A8\u6876\u4E0D\u5B58\u5728: ${this.config.bucket}`);
386
+ throw new StorageProviderError(`\u5B58\u50A8\u6876\u4E0D\u5B58\u5728`);
389
387
  } else if (errorCode === "InvalidAccessKeyId") {
390
388
  throw new StorageProviderError("Access Key ID \u65E0\u6548");
391
389
  } else if (errorCode === "SignatureDoesNotMatch") {
392
390
  throw new StorageProviderError("Access Key Secret \u65E0\u6548");
393
391
  } else {
394
- throw new StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25: ${errorCode} - ${errorMessage}`);
392
+ throw new StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25`);
395
393
  }
396
394
  }
397
- throw new StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25: ${errorMessage}`);
395
+ throw new StorageProviderError(`OSS\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25`);
398
396
  }
399
397
  }
400
398
  /**
@@ -402,7 +400,7 @@ var AliyunOSSProvider = class {
402
400
  */
403
401
  async multipartUpload(filePath, buffer, options) {
404
402
  logger.info(`\u{1F4E6} [AliyunOSSProvider] \u4F7F\u7528\u591A\u5206\u7247\u4E0A\u4F20`);
405
- const result = await this.client.multipartUpload(filePath, buffer, {
403
+ const result = await this.client?.multipartUpload(filePath, buffer, {
406
404
  partSize: 10 * 1024 * 1024,
407
405
  // 10MB per chunk
408
406
  parallel: 4,
@@ -416,11 +414,11 @@ var AliyunOSSProvider = class {
416
414
  headers: options.headers
417
415
  });
418
416
  return {
419
- name: result.name,
420
- url: result.name,
417
+ name: result?.name || "",
418
+ url: result?.name || "",
421
419
  // OSS返回的是object名称
422
- data: result.data,
423
- res: result.res
420
+ data: result?.data || {},
421
+ res: result?.res || {}
424
422
  };
425
423
  }
426
424
  /**
@@ -486,7 +484,7 @@ var AliyunOSSProvider = class {
486
484
  if (contentLength) {
487
485
  options.headers["Content-Length"] = contentLength.toString();
488
486
  }
489
- const result = await this.client.putStream(filePath, readableStream, options);
487
+ const result = await this.client?.putStream(filePath, readableStream, options);
490
488
  const accessUrl = this.generateAccessUrl(filePath);
491
489
  const uploadTime = Date.now() - startTime;
492
490
  logger.info(`\u2705 [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5B8C\u6210: ${filePath}, \u8017\u65F6: ${uploadTime}ms`);
@@ -517,7 +515,7 @@ var AliyunOSSProvider = class {
517
515
  this.ensureInitialized();
518
516
  logger.info(`\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u6279\u91CF\u5220\u9664\u6587\u4EF6\uFF0C\u6570\u91CF: ${filePaths.length}`);
519
517
  try {
520
- const result = await this.client.deleteMulti(filePaths, {
518
+ const result = await this.client?.deleteMulti(filePaths, {
521
519
  quiet: false
522
520
  // 返回删除结果
523
521
  });
@@ -544,7 +542,7 @@ var AliyunOSSProvider = class {
544
542
  this.ensureInitialized();
545
543
  logger.info(`\u{1F4CB} [AliyunOSSProvider] \u5F00\u59CB\u590D\u5236\u6587\u4EF6: ${sourcePath} -> ${targetPath}`);
546
544
  try {
547
- const result = await this.client.copy(targetPath, sourcePath);
545
+ const result = await this.client?.copy(targetPath, sourcePath);
548
546
  logger.info(`\u2705 [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5B8C\u6210: ${sourcePath} -> ${targetPath}`);
549
547
  return {
550
548
  success: true,
@@ -578,5 +576,5 @@ var AliyunOSSProvider = class {
578
576
  };
579
577
 
580
578
  export { AliyunOSSProvider };
581
- //# sourceMappingURL=chunk-SWWRT5FN.mjs.map
582
- //# sourceMappingURL=chunk-SWWRT5FN.mjs.map
579
+ //# sourceMappingURL=chunk-WSNM4EU5.mjs.map
580
+ //# sourceMappingURL=chunk-WSNM4EU5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/universalFile/server/providers/AliyunOSSProvider.ts"],"names":[],"mappings":"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","file":"chunk-WSNM4EU5.mjs","sourcesContent":["/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: OSS | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n `☁️ [AliyunOSSProvider] 新配置: bucket=${newConfig.bucket}, region=${newConfig.region}`\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info(`☁️ [AliyunOSSProvider] ${this.isInitialized ? '重新' : ''}初始化阿里云OSS`);\n logger.info(`☁️ [AliyunOSSProvider] ${this.config ? JSON.stringify(this.config) : ''}`);\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n logger.info(`☁️ [AliyunOSSProvider] 测试连接... testConnection`);\n\n // 测试连接\n await this.testConnection();\n\n this.isInitialized = true;\n logger.info(`✅ [AliyunOSSProvider] 阿里云OSS${configChanged ? '重新' : ''}初始化完成`);\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(`阿里云OSS初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始上传文件到OSS: ${filePath}`);\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n `📦 [AliyunOSSProvider] 使用分片上传大文件: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n `📤 [AliyunOSSProvider] 使用普通上传: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.client?.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 文件上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info(`📥 [AliyunOSSProvider] 开始从OSS下载文件: ${filePath}`);\n\n try {\n const result = await this.client?.get(filePath) as any;\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n `✅ [AliyunOSSProvider] 文件下载完成: ${filePath}, 大小: ${result.content.length}`\n );\n\n return result.content;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件下载失败: ${filePath}:`, error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在`);\n }\n\n throw new StorageProviderError(`文件下载失败`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ${filePath}`);\n\n try {\n const result = await this.client?.delete(filePath) as any;\n\n logger.info(`✅ [AliyunOSSProvider] 文件删除完成: ${filePath}`);\n\n return {\n success: true,\n data: {\n requestId: result?.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件删除失败: ${filePath}:`, error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn(`⚠️ [AliyunOSSProvider] 文件不存在: ${filePath}`);\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client?.head(filePath) as any;\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl || '' ;\n }\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成访问URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成访问URL失败`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl || '' ;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成上传URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成上传URL失败`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client?.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn(`⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ${filePath}:`, error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n throw new StorageProviderError(`列出文件失败`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n try {\n // 尝试列出少量对象来测试连接\n await this.client?.list({\n 'max-keys': '1',\n }, {}) as any;\n logger.info(`✅ [AliyunOSSProvider] OSS连接测试成功`);\n } catch (error: any) {\n logger.error('❌ [AliyunOSSProvider] OSS连接测试失败,原始错误:', error);\n\n // 安全地检查错误类型,避免生产环境中的压缩问题\n let errorCode: string | undefined;\n let errorMessage: string = '未知错误';\n\n try {\n errorCode = error?.code;\n errorMessage = error?.message || '未知错误';\n } catch (accessError) {\n // 如果访问错误属性失败,使用通用错误信息\n logger.warn('无法访问错误对象的属性:', accessError);\n errorMessage = '无法解析错误信息';\n }\n\n if (typeof errorCode === 'string') {\n if (errorCode === 'NoSuchBucket') {\n throw new StorageProviderError(`存储桶不存在`);\n }\n else if (errorCode === 'InvalidAccessKeyId') {\n throw new StorageProviderError('Access Key ID 无效');\n }\n else if (errorCode === 'SignatureDoesNotMatch') {\n throw new StorageProviderError('Access Key Secret 无效');\n }\n else {\n throw new StorageProviderError(`OSS连接测试失败`);\n }\n }\n\n // 如果不是标准的OSS错误,抛出通用错误\n throw new StorageProviderError(`OSS连接测试失败`);\n }\n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client?.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info(`📦 [AliyunOSSProvider] 上传进度: ${(p * 100).toFixed(1)}%`);\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result?.name || '',\n url: result?.name || '', // OSS返回的是object名称\n data: result?.data || {},\n res: result?.res || {},\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.customDomain}/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用自定义域名: ${url}`);\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.bucket}.${this.config.region}.aliyuncs.com/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用默认OSS域名: ${url}`);\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n if (this.isOSSError(error)) {\n const requestId = error.requestId ? ` (RequestId: ${error.requestId})` : '';\n return `${error.code}: ${error.message}${requestId}`;\n }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ${filePath}`);\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client?.putStream(filePath, readableStream, options) as any;\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 流式上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 流式上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ${filePaths.length}`);\n\n try {\n const result = await this.client?.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n }) as any;\n\n logger.info(`✅ [AliyunOSSProvider] 批量删除完成,成功: ${result.deleted?.length || 0}`);\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`📋 [AliyunOSSProvider] 开始复制文件: ${sourcePath} -> ${targetPath}`);\n\n try {\n const result = await this.client?.copy(targetPath, sourcePath) as any;\n\n logger.info(`✅ [AliyunOSSProvider] 文件复制完成: ${sourcePath} -> ${targetPath}`);\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件复制失败: ${sourcePath} -> ${targetPath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkTKCYPDWU_js = require('../../chunk-TKCYPDWU.js');
4
- var chunkBLQRF7C7_js = require('../../chunk-BLQRF7C7.js');
4
+ var chunk5GCHAXY5_js = require('../../chunk-5GCHAXY5.js');
5
5
  var chunkKH6RQ4J5_js = require('../../chunk-KH6RQ4J5.js');
6
6
  var chunk6PRFP5EG_js = require('../../chunk-6PRFP5EG.js');
7
7
  var chunkZRAW3HXA_js = require('../../chunk-ZRAW3HXA.js');
@@ -3413,7 +3413,7 @@ var UniversalFileService = class extends events.EventEmitter {
3413
3413
  try {
3414
3414
  if (this.config.storage) {
3415
3415
  if (this.config.storage.type === "aliyun-oss" && this.config.storage.enabled) {
3416
- const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-KOVWJQLL.js');
3416
+ const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-L7JWMKS4.js');
3417
3417
  const ossProvider = new AliyunOSSProvider2();
3418
3418
  this.registerStorageProvider(ossProvider);
3419
3419
  logger6.info("\u2705 [UniversalFileService] \u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
@@ -5586,7 +5586,7 @@ Object.defineProperty(exports, "LocalStorageProvider", {
5586
5586
  });
5587
5587
  Object.defineProperty(exports, "AliyunOSSProvider", {
5588
5588
  enumerable: true,
5589
- get: function () { return chunkBLQRF7C7_js.AliyunOSSProvider; }
5589
+ get: function () { return chunk5GCHAXY5_js.AliyunOSSProvider; }
5590
5590
  });
5591
5591
  exports.AliyunCDNProvider = AliyunCDNProvider;
5592
5592
  exports.ApiError = ApiError;
@@ -1,5 +1,5 @@
1
1
  export { LocalStorageProvider } from '../../chunk-GSTLV3MB.mjs';
2
- export { AliyunOSSProvider } from '../../chunk-SWWRT5FN.mjs';
2
+ export { AliyunOSSProvider } from '../../chunk-WSNM4EU5.mjs';
3
3
  import { CDNProviderError } from '../../chunk-ZGVB35L2.mjs';
4
4
  import { createLogger } from '../../chunk-KQGP6BTS.mjs';
5
5
  import { StorageProviderError, FileUploadError, FileProcessingError } from '../../chunk-CIVO4R6N.mjs';
@@ -3391,7 +3391,7 @@ var UniversalFileService = class extends EventEmitter {
3391
3391
  try {
3392
3392
  if (this.config.storage) {
3393
3393
  if (this.config.storage.type === "aliyun-oss" && this.config.storage.enabled) {
3394
- const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-YKT256D6.mjs');
3394
+ const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-I7I5YGLB.mjs');
3395
3395
  const ossProvider = new AliyunOSSProvider2();
3396
3396
  this.registerStorageProvider(ossProvider);
3397
3397
  logger6.info("\u2705 [UniversalFileService] \u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sa2kit",
3
- "version": "1.6.27",
3
+ "version": "1.6.29",
4
4
  "description": "A modern, type-safe React utility library with cross-platform support and platform adapters",
5
5
  "keywords": [
6
6
  "react",
@@ -1,15 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkBLQRF7C7_js = require('./chunk-BLQRF7C7.js');
4
- require('./chunk-KH6RQ4J5.js');
5
- require('./chunk-6PRFP5EG.js');
6
- require('./chunk-DGUM43GV.js');
7
-
8
-
9
-
10
- Object.defineProperty(exports, "AliyunOSSProvider", {
11
- enumerable: true,
12
- get: function () { return chunkBLQRF7C7_js.AliyunOSSProvider; }
13
- });
14
- //# sourceMappingURL=AliyunOSSProvider-KOVWJQLL.js.map
15
- //# sourceMappingURL=AliyunOSSProvider-KOVWJQLL.js.map
@@ -1,6 +0,0 @@
1
- export { AliyunOSSProvider } from './chunk-SWWRT5FN.mjs';
2
- import './chunk-ZGVB35L2.mjs';
3
- import './chunk-KQGP6BTS.mjs';
4
- import './chunk-BJTO5JO5.mjs';
5
- //# sourceMappingURL=AliyunOSSProvider-YKT256D6.mjs.map
6
- //# sourceMappingURL=AliyunOSSProvider-YKT256D6.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/universalFile/server/providers/AliyunOSSProvider.ts"],"names":["createLogger","StorageProviderError","OSS"],"mappings":"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","file":"chunk-BLQRF7C7.js","sourcesContent":["/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: any = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n `☁️ [AliyunOSSProvider] 新配置: bucket=${newConfig.bucket}, region=${newConfig.region}`\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info(`☁️ [AliyunOSSProvider] ${this.isInitialized ? '重新' : ''}初始化阿里云OSS`);\n logger.info(`☁️ [AliyunOSSProvider] ${this.config ? JSON.stringify(this.config) : ''}`);\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n logger.info(`☁️ [AliyunOSSProvider] 测试连接... testConnection`);\n\n // 测试连接\n await this.testConnection();\n\n this.isInitialized = true;\n logger.info(`✅ [AliyunOSSProvider] 阿里云OSS${configChanged ? '重新' : ''}初始化完成`);\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(\n `阿里云OSS初始化失败: ${error instanceof Error ? error.message : '未知错误'}`\n );\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始上传文件到OSS: ${filePath}`);\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n `📦 [AliyunOSSProvider] 使用分片上传大文件: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n `📤 [AliyunOSSProvider] 使用普通上传: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.client.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 文件上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info(`📥 [AliyunOSSProvider] 开始从OSS下载文件: ${filePath}`);\n\n try {\n const result = await this.client.get(filePath);\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n `✅ [AliyunOSSProvider] 文件下载完成: ${filePath}, 大小: ${result.content.length}`\n );\n\n return result.content;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件下载失败: ${filePath}:`, error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在: ${filePath}`);\n }\n\n throw new StorageProviderError(`文件下载失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ${filePath}`);\n\n try {\n const result = await this.client.delete(filePath);\n\n logger.info(`✅ [AliyunOSSProvider] 文件删除完成: ${filePath}`);\n\n return {\n success: true,\n data: {\n requestId: result.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件删除失败: ${filePath}:`, error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn(`⚠️ [AliyunOSSProvider] 文件不存在: ${filePath}`);\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client.head(filePath);\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl;\n }\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成访问URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成访问URL失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成上传URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成上传URL失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn(`⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ${filePath}:`, error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client.list(options);\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n throw new StorageProviderError(`列出文件失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client.list(options);\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项: ${missing.join(', ')}`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n try {\n // 尝试列出少量对象来测试连接\n await this.client.list({\n 'max-keys': '1',\n });\n logger.info(`✅ [AliyunOSSProvider] OSS连接测试成功`);\n } catch (error: any) {\n logger.error('❌ [AliyunOSSProvider] OSS连接测试失败,原始错误:', error);\n\n // 安全地检查错误类型,避免生产环境中的压缩问题\n let errorCode: string | undefined;\n let errorMessage: string = '未知错误';\n\n try {\n errorCode = error?.code;\n errorMessage = error?.message || '未知错误';\n } catch (accessError) {\n // 如果访问错误属性失败,使用通用错误信息\n logger.warn('无法访问错误对象的属性:', accessError);\n errorMessage = '无法解析错误信息';\n }\n\n if (typeof errorCode === 'string') {\n if (errorCode === 'NoSuchBucket') {\n throw new StorageProviderError(`存储桶不存在: ${this.config!.bucket}`);\n }\n else if (errorCode === 'InvalidAccessKeyId') {\n throw new StorageProviderError('Access Key ID 无效');\n }\n else if (errorCode === 'SignatureDoesNotMatch') {\n throw new StorageProviderError('Access Key Secret 无效');\n }\n else {\n throw new StorageProviderError(`OSS连接测试失败: ${errorCode} - ${errorMessage}`);\n }\n }\n\n // 如果不是标准的OSS错误,抛出通用错误\n throw new StorageProviderError(`OSS连接测试失败: ${errorMessage}`);\n }\n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info(`📦 [AliyunOSSProvider] 上传进度: ${(p * 100).toFixed(1)}%`);\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result.name,\n url: result.name, // OSS返回的是object名称\n data: result.data,\n res: result.res,\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.customDomain}/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用自定义域名: ${url}`);\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.bucket}.${this.config.region}.aliyuncs.com/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用默认OSS域名: ${url}`);\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n if (this.isOSSError(error)) {\n const requestId = error.requestId ? ` (RequestId: ${error.requestId})` : '';\n return `${error.code}: ${error.message}${requestId}`;\n }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ${filePath}`);\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client.putStream(filePath, readableStream, options);\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 流式上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 流式上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ${filePaths.length}`);\n\n try {\n const result = await this.client.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n });\n\n logger.info(`✅ [AliyunOSSProvider] 批量删除完成,成功: ${result.deleted?.length || 0}`);\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`📋 [AliyunOSSProvider] 开始复制文件: ${sourcePath} -> ${targetPath}`);\n\n try {\n const result = await this.client.copy(targetPath, sourcePath);\n\n logger.info(`✅ [AliyunOSSProvider] 文件复制完成: ${sourcePath} -> ${targetPath}`);\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件复制失败: ${sourcePath} -> ${targetPath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/universalFile/server/providers/AliyunOSSProvider.ts"],"names":[],"mappings":"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","file":"chunk-SWWRT5FN.mjs","sourcesContent":["/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: any = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n `☁️ [AliyunOSSProvider] 新配置: bucket=${newConfig.bucket}, region=${newConfig.region}`\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info(`☁️ [AliyunOSSProvider] ${this.isInitialized ? '重新' : ''}初始化阿里云OSS`);\n logger.info(`☁️ [AliyunOSSProvider] ${this.config ? JSON.stringify(this.config) : ''}`);\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n logger.info(`☁️ [AliyunOSSProvider] 测试连接... testConnection`);\n\n // 测试连接\n await this.testConnection();\n\n this.isInitialized = true;\n logger.info(`✅ [AliyunOSSProvider] 阿里云OSS${configChanged ? '重新' : ''}初始化完成`);\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(\n `阿里云OSS初始化失败: ${error instanceof Error ? error.message : '未知错误'}`\n );\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始上传文件到OSS: ${filePath}`);\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n `📦 [AliyunOSSProvider] 使用分片上传大文件: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n `📤 [AliyunOSSProvider] 使用普通上传: ${filePath}, 大小: ${fileInfo.file.size}`\n );\n result = await this.client.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 文件上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info(`📥 [AliyunOSSProvider] 开始从OSS下载文件: ${filePath}`);\n\n try {\n const result = await this.client.get(filePath);\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n `✅ [AliyunOSSProvider] 文件下载完成: ${filePath}, 大小: ${result.content.length}`\n );\n\n return result.content;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件下载失败: ${filePath}:`, error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在: ${filePath}`);\n }\n\n throw new StorageProviderError(`文件下载失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ${filePath}`);\n\n try {\n const result = await this.client.delete(filePath);\n\n logger.info(`✅ [AliyunOSSProvider] 文件删除完成: ${filePath}`);\n\n return {\n success: true,\n data: {\n requestId: result.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件删除失败: ${filePath}:`, error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn(`⚠️ [AliyunOSSProvider] 文件不存在: ${filePath}`);\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client.head(filePath);\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl;\n }\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成访问URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成访问URL失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl;\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 生成上传URL失败: ${filePath}:`, error);\n throw new StorageProviderError(`生成上传URL失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn(`⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ${filePath}:`, error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client.list(options);\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n throw new StorageProviderError(`列出文件失败: ${this.formatOSSError(error)}`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client.list(options);\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 列出文件失败: ${prefix}:`, error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项: ${missing.join(', ')}`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n try {\n // 尝试列出少量对象来测试连接\n await this.client.list({\n 'max-keys': '1',\n });\n logger.info(`✅ [AliyunOSSProvider] OSS连接测试成功`);\n } catch (error: any) {\n logger.error('❌ [AliyunOSSProvider] OSS连接测试失败,原始错误:', error);\n\n // 安全地检查错误类型,避免生产环境中的压缩问题\n let errorCode: string | undefined;\n let errorMessage: string = '未知错误';\n\n try {\n errorCode = error?.code;\n errorMessage = error?.message || '未知错误';\n } catch (accessError) {\n // 如果访问错误属性失败,使用通用错误信息\n logger.warn('无法访问错误对象的属性:', accessError);\n errorMessage = '无法解析错误信息';\n }\n\n if (typeof errorCode === 'string') {\n if (errorCode === 'NoSuchBucket') {\n throw new StorageProviderError(`存储桶不存在: ${this.config!.bucket}`);\n }\n else if (errorCode === 'InvalidAccessKeyId') {\n throw new StorageProviderError('Access Key ID 无效');\n }\n else if (errorCode === 'SignatureDoesNotMatch') {\n throw new StorageProviderError('Access Key Secret 无效');\n }\n else {\n throw new StorageProviderError(`OSS连接测试失败: ${errorCode} - ${errorMessage}`);\n }\n }\n\n // 如果不是标准的OSS错误,抛出通用错误\n throw new StorageProviderError(`OSS连接测试失败: ${errorMessage}`);\n }\n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info(`📦 [AliyunOSSProvider] 上传进度: ${(p * 100).toFixed(1)}%`);\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result.name,\n url: result.name, // OSS返回的是object名称\n data: result.data,\n res: result.res,\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.customDomain}/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用自定义域名: ${url}`);\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = `${protocol}://${this.config.bucket}.${this.config.region}.aliyuncs.com/${normalizedPath}`;\n logger.info(`🔗 [AliyunOSSProvider] 使用默认OSS域名: ${url}`);\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n if (this.isOSSError(error)) {\n const requestId = error.requestId ? ` (RequestId: ${error.requestId})` : '';\n return `${error.code}: ${error.message}${requestId}`;\n }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ${filePath}`);\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client.putStream(filePath, readableStream, options);\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [AliyunOSSProvider] 流式上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 流式上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ${filePaths.length}`);\n\n try {\n const result = await this.client.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n });\n\n logger.info(`✅ [AliyunOSSProvider] 批量删除完成,成功: ${result.deleted?.length || 0}`);\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`📋 [AliyunOSSProvider] 开始复制文件: ${sourcePath} -> ${targetPath}`);\n\n try {\n const result = await this.client.copy(targetPath, sourcePath);\n\n logger.info(`✅ [AliyunOSSProvider] 文件复制完成: ${sourcePath} -> ${targetPath}`);\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 文件复制失败: ${sourcePath} -> ${targetPath}:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n"]}