sa2kit 1.6.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -94
- package/dist/AliyunOSSProvider-2UZRIGT3.mjs +6 -0
- package/dist/{AliyunOSSProvider-GQMSDJGZ.mjs.map → AliyunOSSProvider-2UZRIGT3.mjs.map} +1 -1
- package/dist/AliyunOSSProvider-XCTK3QQA.js +15 -0
- package/dist/{AliyunOSSProvider-7JLMJDXK.js.map → AliyunOSSProvider-XCTK3QQA.js.map} +1 -1
- package/dist/{chunk-3RFBUDRA.js → chunk-EXT3IKQA.js} +39 -6
- package/dist/chunk-EXT3IKQA.js.map +1 -0
- package/dist/{chunk-YVBU7QDJ.mjs → chunk-OHUE7EL6.mjs} +34 -5
- package/dist/chunk-OHUE7EL6.mjs.map +1 -0
- package/dist/mmd/admin/index.d.mts +1 -1
- package/dist/mmd/admin/index.d.ts +1 -1
- package/dist/mmd/admin/index.js +7 -1
- package/dist/mmd/admin/index.js.map +1 -1
- package/dist/mmd/admin/index.mjs +7 -1
- package/dist/mmd/admin/index.mjs.map +1 -1
- package/dist/mmd/index.d.mts +20 -3
- package/dist/mmd/index.d.ts +20 -3
- package/dist/mmd/index.js +199 -41
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +200 -42
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.d.mts +1 -1
- package/dist/mmd/server/index.d.ts +1 -1
- package/dist/{types-CsTSddwu.d.mts → types-DxYJqqes.d.mts} +34 -2
- package/dist/{types-CsTSddwu.d.ts → types-DxYJqqes.d.ts} +34 -2
- package/dist/universalFile/server/index.d.mts +15 -0
- package/dist/universalFile/server/index.d.ts +15 -0
- package/dist/universalFile/server/index.js +3 -3
- package/dist/universalFile/server/index.mjs +2 -2
- package/package.json +4 -1
- package/dist/AliyunOSSProvider-7JLMJDXK.js +0 -15
- package/dist/AliyunOSSProvider-GQMSDJGZ.mjs +0 -6
- package/dist/chunk-3RFBUDRA.js.map +0 -1
- package/dist/chunk-YVBU7QDJ.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
1
|
# SA2Kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个现代的、类型安全的 React 工具库,具有跨平台支持,用于构建可扩展的应用程序。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 特性
|
|
6
6
|
|
|
7
|
-
- 🚀
|
|
8
|
-
- 📦 **Tree-shakeable** -
|
|
9
|
-
- 🔄
|
|
10
|
-
- ⚡
|
|
11
|
-
- 🧩
|
|
12
|
-
- 🎯 **React Hooks** -
|
|
13
|
-
- 📝
|
|
14
|
-
- 💾
|
|
15
|
-
- 📁
|
|
16
|
-
- 📊
|
|
17
|
-
- 🌍 **i18n** -
|
|
18
|
-
- 📈
|
|
7
|
+
- 🚀 **现代 TypeScript** - 完整的类型安全和 IntelliSense 支持
|
|
8
|
+
- 📦 **Tree-shakeable** - 使用 ESM 支持优化包大小
|
|
9
|
+
- 🔄 **跨平台** - 适用于浏览器和 Node.js 环境
|
|
10
|
+
- ⚡ **零依赖** - 极小的体积(React 作为 peer dependency)
|
|
11
|
+
- 🧩 **模块化** - 仅导入你需要的部分
|
|
12
|
+
- 🎯 **React Hooks** - 常用模式的自定义 Hook
|
|
13
|
+
- 📝 **日志系统** - 统一的日志记录,支持多个适配器
|
|
14
|
+
- 💾 **存储适配器** - 通用存储抽象
|
|
15
|
+
- 📁 **文件上传** - 完整的文件管理,支持进度追踪
|
|
16
|
+
- 📊 **数据导出** - 灵活导出为 CSV、Excel、JSON 格式
|
|
17
|
+
- 🌍 **i18n** - 完整的国际化解决方案
|
|
18
|
+
- 📈 **数据分析** - 全面的事件跟踪和分析
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## 安装
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
23
|
npm install @qhr123/sa2kit
|
|
24
|
-
#
|
|
24
|
+
# 或
|
|
25
25
|
yarn add @qhr123/sa2kit
|
|
26
|
-
#
|
|
26
|
+
# 或
|
|
27
27
|
pnpm add @qhr123/sa2kit
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## 快速开始
|
|
31
31
|
|
|
32
|
-
### Logger
|
|
32
|
+
### 日志 (Logger)
|
|
33
33
|
|
|
34
34
|
```typescript
|
|
35
35
|
import { logger, createLogger, LogLevel } from '@qhr123/sa2kit/logger';
|
|
36
36
|
|
|
37
|
-
//
|
|
38
|
-
logger.info('
|
|
39
|
-
logger.debug('
|
|
40
|
-
logger.error('
|
|
37
|
+
// 使用默认日志记录器
|
|
38
|
+
logger.info('应用程序已启动');
|
|
39
|
+
logger.debug('调试信息', { user: 'John' });
|
|
40
|
+
logger.error('发生错误', new Error('错误详情'));
|
|
41
41
|
|
|
42
|
-
//
|
|
42
|
+
// 创建带有上下文的自定义日志记录器
|
|
43
43
|
const apiLogger = createLogger('API', {
|
|
44
44
|
minLevel: LogLevel.INFO,
|
|
45
45
|
enableTimestamp: true,
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
apiLogger.info('API
|
|
48
|
+
apiLogger.info('API 请求已完成');
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
### Utility Functions
|
|
51
|
+
### 工具函数 (Utility Functions)
|
|
52
52
|
|
|
53
53
|
```typescript
|
|
54
54
|
import { stringUtils, arrayUtils, fileUtils } from '@qhr123/sa2kit/utils';
|
|
55
55
|
|
|
56
|
-
//
|
|
56
|
+
// 字符串工具
|
|
57
57
|
const capitalized = stringUtils.capitalize('hello world');
|
|
58
|
-
const truncated = stringUtils.truncate('
|
|
58
|
+
const truncated = stringUtils.truncate('这是一段很长的文本...', 10);
|
|
59
59
|
|
|
60
|
-
//
|
|
60
|
+
// 数组工具
|
|
61
61
|
const unique = arrayUtils.unique([1, 2, 2, 3, 3, 4]);
|
|
62
62
|
const grouped = arrayUtils.groupBy(items, 'category');
|
|
63
63
|
|
|
64
|
-
//
|
|
64
|
+
// 文件工具
|
|
65
65
|
const size = fileUtils.formatFileSize(1024000);
|
|
66
66
|
const isValid = fileUtils.isValidFilename('document.pdf');
|
|
67
67
|
```
|
|
@@ -72,22 +72,22 @@ const isValid = fileUtils.isValidFilename('document.pdf');
|
|
|
72
72
|
import { useLocalStorage, useAsyncStorage } from '@qhr123/sa2kit/hooks';
|
|
73
73
|
|
|
74
74
|
function MyComponent() {
|
|
75
|
-
//
|
|
75
|
+
// 使用 localStorage 进行持久化状态管理
|
|
76
76
|
const [theme, setTheme] = useLocalStorage('theme', 'light');
|
|
77
77
|
|
|
78
|
-
//
|
|
78
|
+
// 异步存储操作
|
|
79
79
|
const { data, loading, error } = useAsyncStorage('user-data');
|
|
80
80
|
|
|
81
|
-
return <div
|
|
81
|
+
return <div>当前主题: {theme}</div>;
|
|
82
82
|
}
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
### File Upload
|
|
85
|
+
### 文件上传 (File Upload)
|
|
86
86
|
|
|
87
87
|
```typescript
|
|
88
88
|
import { universalFileClient } from '@qhr123/sa2kit/universalFile';
|
|
89
89
|
|
|
90
|
-
//
|
|
90
|
+
// 上传文件并追踪进度
|
|
91
91
|
const uploadFile = async (file: File) => {
|
|
92
92
|
const fileMetadata = await universalFileClient.uploadFile(
|
|
93
93
|
{
|
|
@@ -97,31 +97,31 @@ const uploadFile = async (file: File) => {
|
|
|
97
97
|
permission: 'public',
|
|
98
98
|
},
|
|
99
99
|
(progress) => {
|
|
100
|
-
console.log(
|
|
101
|
-
console.log(
|
|
100
|
+
console.log(`上传进度: ${progress.progress}%`);
|
|
101
|
+
console.log(`上传速度: ${progress.speed} 字节/秒`);
|
|
102
102
|
}
|
|
103
103
|
);
|
|
104
104
|
|
|
105
|
-
console.log('
|
|
105
|
+
console.log('文件已上传,ID:', fileMetadata.id);
|
|
106
106
|
return fileMetadata;
|
|
107
107
|
};
|
|
108
108
|
|
|
109
|
-
//
|
|
109
|
+
// 查询文件
|
|
110
110
|
const files = await universalFileClient.queryFiles({
|
|
111
111
|
moduleId: 'user-avatars',
|
|
112
112
|
pageSize: 20,
|
|
113
113
|
});
|
|
114
114
|
|
|
115
|
-
//
|
|
115
|
+
// 获取文件 URL
|
|
116
116
|
const fileUrl = await universalFileClient.getFileUrl(fileId);
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
### Data Export
|
|
119
|
+
### 数据导出 (Data Export)
|
|
120
120
|
|
|
121
121
|
```typescript
|
|
122
122
|
import { universalExportClient } from '@qhr123/sa2kit/universalExport';
|
|
123
123
|
|
|
124
|
-
//
|
|
124
|
+
// 导出数据为 CSV
|
|
125
125
|
const exportData = async () => {
|
|
126
126
|
const result = await universalExportClient.exportData({
|
|
127
127
|
configId: 'my-export-config',
|
|
@@ -132,11 +132,11 @@ const exportData = async () => {
|
|
|
132
132
|
format: 'csv',
|
|
133
133
|
callbacks: {
|
|
134
134
|
onProgress: (progress) => {
|
|
135
|
-
console.log(
|
|
135
|
+
console.log(`导出进度: ${progress.progress}%`);
|
|
136
136
|
},
|
|
137
137
|
onSuccess: (result) => {
|
|
138
|
-
console.log('
|
|
139
|
-
//
|
|
138
|
+
console.log('导出完成:', result.fileName);
|
|
139
|
+
// 下载文件
|
|
140
140
|
const url = URL.createObjectURL(result.fileBlob!);
|
|
141
141
|
const a = document.createElement('a');
|
|
142
142
|
a.href = url;
|
|
@@ -148,13 +148,13 @@ const exportData = async () => {
|
|
|
148
148
|
};
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
-
###
|
|
151
|
+
### 国际化 (i18n)
|
|
152
152
|
|
|
153
153
|
```typescript
|
|
154
154
|
import { createI18n, useTranslation } from '@qhr123/sa2kit/i18n';
|
|
155
155
|
import { zhCN, enUS } from '@qhr123/sa2kit/i18n';
|
|
156
156
|
|
|
157
|
-
//
|
|
157
|
+
// 创建 i18n 实例
|
|
158
158
|
const i18n = createI18n({
|
|
159
159
|
locale: 'zh-CN',
|
|
160
160
|
fallbackLocale: 'en-US',
|
|
@@ -164,7 +164,7 @@ const i18n = createI18n({
|
|
|
164
164
|
},
|
|
165
165
|
});
|
|
166
166
|
|
|
167
|
-
//
|
|
167
|
+
// 在 React 组件中使用
|
|
168
168
|
function MyComponent() {
|
|
169
169
|
const { t, locale, setLocale } = useTranslation();
|
|
170
170
|
|
|
@@ -172,51 +172,50 @@ function MyComponent() {
|
|
|
172
172
|
<div>
|
|
173
173
|
<p>{t('common.welcome')}</p>
|
|
174
174
|
<button onClick={() => setLocale('en-US')}>
|
|
175
|
-
|
|
175
|
+
切换为英文
|
|
176
176
|
</button>
|
|
177
177
|
</div>
|
|
178
178
|
);
|
|
179
179
|
}
|
|
180
180
|
```
|
|
181
181
|
|
|
182
|
-
#### UI
|
|
182
|
+
#### UI 组件 (Tailwind CSS)
|
|
183
183
|
|
|
184
184
|
```typescript
|
|
185
185
|
import { LanguageSwitcher } from '@qhr123/sa2kit/i18n';
|
|
186
186
|
|
|
187
|
-
//
|
|
187
|
+
// 按钮组样式 (默认)
|
|
188
188
|
<LanguageSwitcher variant="buttons" />
|
|
189
189
|
|
|
190
|
-
//
|
|
190
|
+
// 下拉菜单样式
|
|
191
191
|
<LanguageSwitcher variant="dropdown" />
|
|
192
192
|
|
|
193
|
-
//
|
|
193
|
+
// 带有下拉菜单的图标按钮
|
|
194
194
|
<LanguageSwitcher variant="icon" />
|
|
195
195
|
|
|
196
|
-
//
|
|
196
|
+
// 带有自定义类名和回调
|
|
197
197
|
<LanguageSwitcher
|
|
198
198
|
variant="buttons"
|
|
199
199
|
className="my-custom-class"
|
|
200
200
|
onLanguageChange={(locale) => {
|
|
201
|
-
console.log('
|
|
201
|
+
console.log('语言已切换为:', locale);
|
|
202
202
|
}}
|
|
203
203
|
/>
|
|
204
204
|
```
|
|
205
205
|
|
|
206
|
-
|
|
206
|
+
**要求:**
|
|
207
207
|
- ✅ React >= 18.0.0
|
|
208
|
-
- ✅ Tailwind CSS
|
|
209
|
-
- ✅ Next.js App Router
|
|
210
|
-
```
|
|
208
|
+
- ✅ 项目中已配置 Tailwind CSS ([设置指南](./docs/tailwind-setup.md))
|
|
209
|
+
- ✅ 兼容 Next.js App Router (已包含 'use client')
|
|
211
210
|
|
|
212
|
-
|
|
211
|
+
**注意:** UI 组件使用 Tailwind CSS。请参阅 [Tailwind 设置指南](./docs/tailwind-setup.md) 获取配置说明。
|
|
213
212
|
|
|
214
|
-
### Analytics
|
|
213
|
+
### 数据分析 (Analytics)
|
|
215
214
|
|
|
216
215
|
```typescript
|
|
217
216
|
import { Analytics, createAnalytics } from '@qhr123/sa2kit/analytics';
|
|
218
217
|
|
|
219
|
-
//
|
|
218
|
+
// 创建分析实例 (需要提供适配器)
|
|
220
219
|
const analytics = createAnalytics('my-app', {
|
|
221
220
|
appId: 'my-app',
|
|
222
221
|
appVersion: '1.0.0',
|
|
@@ -225,74 +224,74 @@ const analytics = createAnalytics('my-app', {
|
|
|
225
224
|
adapter: yourPlatformAdapter, // 需要自行实现
|
|
226
225
|
});
|
|
227
226
|
|
|
228
|
-
//
|
|
227
|
+
// 追踪事件
|
|
229
228
|
analytics.trackEvent('button_click', {
|
|
230
229
|
button_id: 'submit',
|
|
231
230
|
page: 'home',
|
|
232
231
|
});
|
|
233
232
|
|
|
234
|
-
//
|
|
233
|
+
// 使用装饰器 (TypeScript)
|
|
235
234
|
class MyService {
|
|
236
235
|
@Track('user_login')
|
|
237
236
|
async login(username: string) {
|
|
238
|
-
//
|
|
237
|
+
// 登录逻辑
|
|
239
238
|
}
|
|
240
239
|
|
|
241
240
|
@CatchError()
|
|
242
241
|
async fetchData() {
|
|
243
|
-
//
|
|
242
|
+
// 获取数据逻辑
|
|
244
243
|
}
|
|
245
244
|
}
|
|
246
245
|
|
|
247
|
-
//
|
|
246
|
+
// 使用 React Hooks
|
|
248
247
|
function MyComponent() {
|
|
249
248
|
const trackEvent = useAnalyticsEvent(analytics);
|
|
250
249
|
|
|
251
|
-
usePageView(analytics); //
|
|
250
|
+
usePageView(analytics); // 自动追踪页面访问
|
|
252
251
|
|
|
253
252
|
const handleClick = () => {
|
|
254
253
|
trackEvent('button_click', { action: 'submit' });
|
|
255
254
|
};
|
|
256
255
|
|
|
257
|
-
return <button onClick={handleClick}
|
|
256
|
+
return <button onClick={handleClick}>提交</button>;
|
|
258
257
|
}
|
|
259
258
|
```
|
|
260
259
|
|
|
261
|
-
##
|
|
260
|
+
## 文档
|
|
262
261
|
|
|
263
|
-
- [Tailwind CSS
|
|
264
|
-
- [
|
|
265
|
-
- [
|
|
266
|
-
- [React Hooks](./docs/hooks.md)
|
|
267
|
-
- [
|
|
268
|
-
- [
|
|
269
|
-
- [
|
|
270
|
-
- [
|
|
271
|
-
- [
|
|
262
|
+
- [Tailwind CSS 设置](./docs/tailwind-setup.md) - **UI 组件配置**
|
|
263
|
+
- [日志文档](./docs/logger.md)
|
|
264
|
+
- [工具函数文档](./docs/utils.md)
|
|
265
|
+
- [React Hooks 文档](./docs/hooks.md)
|
|
266
|
+
- [存储适配器文档](./docs/storage.md)
|
|
267
|
+
- [文件上传服务文档](./docs/universalFile.md)
|
|
268
|
+
- [OSS 管理模块文档](./docs/ossManager.md) - **阿里云 OSS 管理界面**
|
|
269
|
+
- [数据导出服务文档](./docs/universalExport.md)
|
|
270
|
+
- [i18n 国际化文档](./docs/i18n.md)
|
|
271
|
+
- [数据分析追踪文档](./docs/analytics.md)
|
|
272
272
|
|
|
273
|
-
##
|
|
273
|
+
## 示例
|
|
274
274
|
|
|
275
|
-
|
|
275
|
+
查看 [examples](./examples) 目录以获取完整的运行示例:
|
|
276
276
|
|
|
277
|
-
- React
|
|
278
|
-
- Next.js
|
|
279
|
-
- TypeScript
|
|
277
|
+
- React 应用示例
|
|
278
|
+
- Next.js 集成
|
|
279
|
+
- TypeScript 配置
|
|
280
280
|
|
|
281
|
-
## API
|
|
281
|
+
## API 参考
|
|
282
282
|
|
|
283
|
-
|
|
283
|
+
完整的 API 文档可在 [https://react-utils-kit.dev](https://react-utils-kit.dev) 找到
|
|
284
284
|
|
|
285
|
-
##
|
|
285
|
+
## 贡献
|
|
286
286
|
|
|
287
|
-
|
|
287
|
+
我们欢迎贡献!详情请参阅 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
|
288
288
|
|
|
289
|
-
##
|
|
289
|
+
## 许可证
|
|
290
290
|
|
|
291
291
|
MIT © [Your Name](LICENSE)
|
|
292
292
|
|
|
293
|
-
##
|
|
294
|
-
|
|
295
|
-
- 🐛 [Report a bug](https://github.com/your-org/react-utils-kit/issues)
|
|
296
|
-
- 💡 [Request a feature](https://github.com/your-org/react-utils-kit/issues)
|
|
297
|
-
- 📖 [Documentation](https://react-utils-kit.dev)
|
|
293
|
+
## 支持
|
|
298
294
|
|
|
295
|
+
- 🐛 [报告错误](https://github.com/your-org/react-utils-kit/issues)
|
|
296
|
+
- 💡 [请求特性](https://github.com/your-org/react-utils-kit/issues)
|
|
297
|
+
- 📖 [文档中心](https://react-utils-kit.dev)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AliyunOSSProvider } from './chunk-OHUE7EL6.mjs';
|
|
2
|
+
import './chunk-ZGVB35L2.mjs';
|
|
3
|
+
import './chunk-KQGP6BTS.mjs';
|
|
4
|
+
import './chunk-BJTO5JO5.mjs';
|
|
5
|
+
//# sourceMappingURL=AliyunOSSProvider-2UZRIGT3.mjs.map
|
|
6
|
+
//# sourceMappingURL=AliyunOSSProvider-2UZRIGT3.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-2UZRIGT3.mjs"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkEXT3IKQA_js = require('./chunk-EXT3IKQA.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 chunkEXT3IKQA_js.AliyunOSSProvider; }
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=AliyunOSSProvider-XCTK3QQA.js.map
|
|
15
|
+
//# sourceMappingURL=AliyunOSSProvider-XCTK3QQA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"AliyunOSSProvider-XCTK3QQA.js"}
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkKH6RQ4J5_js = require('./chunk-KH6RQ4J5.js');
|
|
4
4
|
var chunk6PRFP5EG_js = require('./chunk-6PRFP5EG.js');
|
|
5
|
-
var
|
|
5
|
+
var OSS = require('ali-oss');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var OSS__default = /*#__PURE__*/_interopDefault(OSS);
|
|
6
10
|
|
|
7
|
-
// src/universalFile/server/providers/AliyunOSSProvider.ts
|
|
8
|
-
var OSS = chunkDGUM43GV_js.__require("ali-oss");
|
|
9
11
|
var logger = chunk6PRFP5EG_js.createLogger("AliyunOSSProvider");
|
|
10
12
|
var AliyunOSSProvider = class {
|
|
11
13
|
constructor() {
|
|
@@ -42,7 +44,7 @@ var AliyunOSSProvider = class {
|
|
|
42
44
|
logger.info(`\u2601\uFE0F [AliyunOSSProvider] ${this.isInitialized ? "\u91CD\u65B0" : ""}\u521D\u59CB\u5316\u963F\u91CC\u4E91OSS`);
|
|
43
45
|
try {
|
|
44
46
|
this.validateConfig();
|
|
45
|
-
this.client = new
|
|
47
|
+
this.client = new OSS__default.default({
|
|
46
48
|
region: this.config.region,
|
|
47
49
|
bucket: this.config.bucket,
|
|
48
50
|
accessKeyId: this.config.accessKeyId,
|
|
@@ -269,6 +271,37 @@ var AliyunOSSProvider = class {
|
|
|
269
271
|
return false;
|
|
270
272
|
}
|
|
271
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* 列出文件(详细信息)
|
|
276
|
+
*/
|
|
277
|
+
async listFiles(prefix, delimiter = "/", maxKeys = 1e3) {
|
|
278
|
+
this.ensureInitialized();
|
|
279
|
+
try {
|
|
280
|
+
const options = {
|
|
281
|
+
prefix,
|
|
282
|
+
delimiter,
|
|
283
|
+
"max-keys": String(maxKeys)
|
|
284
|
+
};
|
|
285
|
+
const result = await this.client.list(options);
|
|
286
|
+
const files = (result.objects || []).map((obj) => ({
|
|
287
|
+
name: obj.name,
|
|
288
|
+
url: this.generateAccessUrl(obj.name),
|
|
289
|
+
size: obj.size,
|
|
290
|
+
lastModified: obj.lastModified,
|
|
291
|
+
etag: obj.etag,
|
|
292
|
+
type: "file"
|
|
293
|
+
}));
|
|
294
|
+
const folders = result.prefixes || [];
|
|
295
|
+
return {
|
|
296
|
+
files,
|
|
297
|
+
folders,
|
|
298
|
+
nextMarker: result.nextMarker
|
|
299
|
+
};
|
|
300
|
+
} catch (error) {
|
|
301
|
+
logger.error(`\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${prefix}:`, error);
|
|
302
|
+
throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${this.formatOSSError(error)}`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
272
305
|
/**
|
|
273
306
|
* 列出文件
|
|
274
307
|
*/
|
|
@@ -503,5 +536,5 @@ var AliyunOSSProvider = class {
|
|
|
503
536
|
};
|
|
504
537
|
|
|
505
538
|
exports.AliyunOSSProvider = AliyunOSSProvider;
|
|
506
|
-
//# sourceMappingURL=chunk-
|
|
507
|
-
//# sourceMappingURL=chunk-
|
|
539
|
+
//# sourceMappingURL=chunk-EXT3IKQA.js.map
|
|
540
|
+
//# sourceMappingURL=chunk-EXT3IKQA.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-EXT3IKQA.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\n try {\n // 验证必需的配置项\n this.validateConfig();\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 // 测试连接\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) {\n if (this.isOSSError(error)) {\n if (error.code === 'NoSuchBucket') {\n throw new StorageProviderError(`存储桶不存在: ${this.config!.bucket}`);\n }\n if (error.code === 'InvalidAccessKeyId') {\n throw new StorageProviderError('Access Key ID 无效');\n }\n if (error.code === 'SignatureDoesNotMatch') {\n throw new StorageProviderError('Access Key Secret 无效');\n }\n }\n throw error;\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 return error && typeof error.code === 'string' && typeof error.name === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n if (this.isOSSError(error)) {\n return `${error.code}: ${error.message}${error.requestId ? ` (RequestId: ${error.requestId})` : ''}`;\n }\n return error instanceof Error ? error.message : '未知错误';\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,9 +1,7 @@
|
|
|
1
1
|
import { StorageProviderError } from './chunk-ZGVB35L2.mjs';
|
|
2
2
|
import { createLogger } from './chunk-KQGP6BTS.mjs';
|
|
3
|
-
import
|
|
3
|
+
import OSS from 'ali-oss';
|
|
4
4
|
|
|
5
|
-
// src/universalFile/server/providers/AliyunOSSProvider.ts
|
|
6
|
-
var OSS = __require("ali-oss");
|
|
7
5
|
var logger = createLogger("AliyunOSSProvider");
|
|
8
6
|
var AliyunOSSProvider = class {
|
|
9
7
|
constructor() {
|
|
@@ -267,6 +265,37 @@ var AliyunOSSProvider = class {
|
|
|
267
265
|
return false;
|
|
268
266
|
}
|
|
269
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* 列出文件(详细信息)
|
|
270
|
+
*/
|
|
271
|
+
async listFiles(prefix, delimiter = "/", maxKeys = 1e3) {
|
|
272
|
+
this.ensureInitialized();
|
|
273
|
+
try {
|
|
274
|
+
const options = {
|
|
275
|
+
prefix,
|
|
276
|
+
delimiter,
|
|
277
|
+
"max-keys": String(maxKeys)
|
|
278
|
+
};
|
|
279
|
+
const result = await this.client.list(options);
|
|
280
|
+
const files = (result.objects || []).map((obj) => ({
|
|
281
|
+
name: obj.name,
|
|
282
|
+
url: this.generateAccessUrl(obj.name),
|
|
283
|
+
size: obj.size,
|
|
284
|
+
lastModified: obj.lastModified,
|
|
285
|
+
etag: obj.etag,
|
|
286
|
+
type: "file"
|
|
287
|
+
}));
|
|
288
|
+
const folders = result.prefixes || [];
|
|
289
|
+
return {
|
|
290
|
+
files,
|
|
291
|
+
folders,
|
|
292
|
+
nextMarker: result.nextMarker
|
|
293
|
+
};
|
|
294
|
+
} catch (error) {
|
|
295
|
+
logger.error(`\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${prefix}:`, error);
|
|
296
|
+
throw new StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25: ${this.formatOSSError(error)}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
270
299
|
/**
|
|
271
300
|
* 列出文件
|
|
272
301
|
*/
|
|
@@ -501,5 +530,5 @@ var AliyunOSSProvider = class {
|
|
|
501
530
|
};
|
|
502
531
|
|
|
503
532
|
export { AliyunOSSProvider };
|
|
504
|
-
//# sourceMappingURL=chunk-
|
|
505
|
-
//# sourceMappingURL=chunk-
|
|
533
|
+
//# sourceMappingURL=chunk-OHUE7EL6.mjs.map
|
|
534
|
+
//# sourceMappingURL=chunk-OHUE7EL6.mjs.map
|