@data-loom/storage-js 0.4.1 → 0.4.2-alpha.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 +423 -109
- package/dist/main/StorageClient.d.ts +1 -1
- package/dist/main/StorageClient.d.ts.map +1 -1
- package/dist/main/lib/helpers.d.ts +1 -0
- package/dist/main/lib/helpers.d.ts.map +1 -1
- package/dist/main/lib/helpers.js +6 -1
- package/dist/main/lib/helpers.js.map +1 -1
- package/dist/main/lib/types.d.ts +27 -1
- package/dist/main/lib/types.d.ts.map +1 -1
- package/dist/main/packages/StorageBucketApi.js +1 -1
- package/dist/main/packages/StorageBucketApi.js.map +1 -1
- package/dist/main/packages/StorageFileApi.d.ts +20 -1
- package/dist/main/packages/StorageFileApi.d.ts.map +1 -1
- package/dist/main/packages/StorageFileApi.js +63 -13
- package/dist/main/packages/StorageFileApi.js.map +1 -1
- package/dist/main/utils/logger.d.ts.map +1 -1
- package/dist/main/utils/logger.js +7 -1
- package/dist/main/utils/logger.js.map +1 -1
- package/dist/module/StorageClient.d.ts +1 -1
- package/dist/module/StorageClient.d.ts.map +1 -1
- package/dist/module/lib/helpers.d.ts +1 -0
- package/dist/module/lib/helpers.d.ts.map +1 -1
- package/dist/module/lib/helpers.js +4 -0
- package/dist/module/lib/helpers.js.map +1 -1
- package/dist/module/lib/types.d.ts +27 -1
- package/dist/module/lib/types.d.ts.map +1 -1
- package/dist/module/packages/StorageBucketApi.js +1 -1
- package/dist/module/packages/StorageBucketApi.js.map +1 -1
- package/dist/module/packages/StorageFileApi.d.ts +20 -1
- package/dist/module/packages/StorageFileApi.d.ts.map +1 -1
- package/dist/module/packages/StorageFileApi.js +64 -14
- package/dist/module/packages/StorageFileApi.js.map +1 -1
- package/dist/module/utils/logger.d.ts.map +1 -1
- package/dist/module/utils/logger.js +7 -1
- package/dist/module/utils/logger.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,165 +1,479 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @data-loom/storage-js
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Dataloom 存储服务 JavaScript SDK,基于 Supabase Storage 修改而来,提供了强大的文件存储和管理功能。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 功能特性
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- 📁 **文件上传和下载** - 支持多种文件格式的上传和下载
|
|
8
|
+
- 🔗 **签名URL** - 创建具有时效性的安全文件访问链接
|
|
9
|
+
- 🗑️ **文件管理** - 删除、列表等文件操作
|
|
10
|
+
- 🖼️ **图片转换** - 支持图片尺寸调整、质量优化等转换功能
|
|
11
|
+
- 📊 **批量操作** - 支持批量创建签名URL等批量操作
|
|
12
|
+
- 🔍 **文件搜索** - 支持文件搜索和分页
|
|
13
|
+
- 🛡️ **错误处理** - 完善的错误处理机制
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
## 安装
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
```bash
|
|
18
|
+
npm install @data-loom/storage-js
|
|
19
|
+
```
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
## 快速开始
|
|
22
|
+
|
|
23
|
+
**默认推荐使用挂载在 @data-loom/js 中的 storage 接口。**
|
|
24
|
+
```javascript
|
|
25
|
+
import { createClient } from '@data-loom/js';
|
|
26
|
+
const dataloom = createClient(url, key, workspace, {
|
|
27
|
+
global: {
|
|
28
|
+
brandName: 'your_brand_name',
|
|
29
|
+
appId: 'your_app_id',
|
|
30
|
+
enableDataloomLog: true,
|
|
31
|
+
requestRateLimit: 10,
|
|
32
|
+
onError: (error) => {
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const { data, error } = await dataloom.storage.from('bucket_id').download('file_path');
|
|
37
|
+
```
|
|
14
38
|
|
|
15
|
-
|
|
39
|
+
**或者可以独立使用 storage-js 包。**
|
|
40
|
+
```javascript
|
|
41
|
+
import { StorageClient } from '@data-loom/storage-js'
|
|
42
|
+
|
|
43
|
+
// 独立初始化存储客户端
|
|
44
|
+
const storage = new StorageClient(
|
|
45
|
+
storageUrl,
|
|
46
|
+
customHeaders,
|
|
47
|
+
customFetch,
|
|
48
|
+
{
|
|
49
|
+
enableLogger: true,
|
|
50
|
+
appId: 'your-app-id',
|
|
51
|
+
onRequestError: (error) => console.error('请求错误:', error),
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// 上传文件
|
|
56
|
+
const { data, error } = await storage.upload('folder/image.png', file);
|
|
57
|
+
if (error) {
|
|
58
|
+
console.error('上传失败:', error);
|
|
59
|
+
} else {
|
|
60
|
+
console.log('上传成功:', data);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
16
63
|
|
|
17
|
-
|
|
64
|
+
## API 接口文档
|
|
18
65
|
|
|
19
|
-
|
|
20
|
-
|
|
66
|
+
### 构造函数
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
constructor(
|
|
70
|
+
url: string, // 存储服务URL
|
|
71
|
+
headers: { [key: string]: string } = {}, // 请求头
|
|
72
|
+
bucketId?: string, // 存储桶ID
|
|
73
|
+
appId?: string, // 应用ID
|
|
74
|
+
fetch?: Fetch, // 自定义fetch函数
|
|
75
|
+
loggerEnabled?: boolean, // 是否启用日志
|
|
76
|
+
onRequestError?: (error: OnRequestErrorType) => void // 请求错误回调
|
|
77
|
+
)
|
|
21
78
|
```
|
|
22
79
|
|
|
23
|
-
###
|
|
80
|
+
### 文件上传
|
|
81
|
+
|
|
82
|
+
#### `upload(path, fileBody, fileOptions?)`
|
|
24
83
|
|
|
25
|
-
|
|
26
|
-
import { StorageClient } from '@supabase/storage-js'
|
|
84
|
+
上传文件到指定的存储桶路径。
|
|
27
85
|
|
|
28
|
-
|
|
29
|
-
|
|
86
|
+
**参数:**
|
|
87
|
+
- `path` (string): 文件路径,格式为 `folder/subfolder/filename.png`
|
|
88
|
+
- `fileBody` (FileBody): 文件内容,支持多种格式
|
|
89
|
+
- `fileOptions` (FileOptions, 可选): 文件选项
|
|
30
90
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
91
|
+
**返回:**
|
|
92
|
+
```typescript
|
|
93
|
+
{
|
|
94
|
+
data: UploadFileData; // 包含文件ID、路径、存储桶ID和下载URL
|
|
95
|
+
error: null;
|
|
96
|
+
} | {
|
|
97
|
+
data: null;
|
|
98
|
+
error: StorageError;
|
|
99
|
+
}
|
|
35
100
|
```
|
|
36
101
|
|
|
37
|
-
|
|
102
|
+
**示例:**
|
|
103
|
+
```javascript
|
|
104
|
+
const fileInput = document.getElementById('fileInput');
|
|
105
|
+
const file = fileInput.files[0];
|
|
38
106
|
|
|
39
|
-
|
|
107
|
+
const { data, error } = await storage.upload('avatars/user-123.jpg', file, {
|
|
108
|
+
cacheControl: '3600',
|
|
109
|
+
contentType: 'image/jpeg',
|
|
110
|
+
upsert: false
|
|
111
|
+
});
|
|
112
|
+
```
|
|
40
113
|
|
|
41
|
-
|
|
114
|
+
#### `uploadFile(fileBody, fileOptions?)`
|
|
42
115
|
|
|
43
|
-
|
|
44
|
-
const { data, error } = await storageClient.createBucket(
|
|
45
|
-
'test_bucket', // Bucket name (must be unique)
|
|
46
|
-
{ public: false } // Bucket options
|
|
47
|
-
)
|
|
48
|
-
```
|
|
116
|
+
使用文件选项上传文件(推荐, 无需关注filePath)。
|
|
49
117
|
|
|
50
|
-
|
|
118
|
+
**参数:**
|
|
119
|
+
- `fileBody` (FileBody): 文件内容
|
|
120
|
+
- `fileOptions` (FileOptionsV2, 可选): 文件选项,可指定 filePath 等
|
|
51
121
|
|
|
52
|
-
|
|
53
|
-
const { data, error } = await storageClient.getBucket('test_bucket')
|
|
54
|
-
```
|
|
122
|
+
**返回:** 同 `upload` 方法
|
|
55
123
|
|
|
56
|
-
|
|
124
|
+
**示例:**
|
|
125
|
+
```javascript
|
|
126
|
+
const { data, error } = await storage.uploadFile(file, {
|
|
127
|
+
filePath: 'documents/report.pdf',
|
|
128
|
+
cacheControl: 3600,
|
|
129
|
+
contentType: 'application/pdf',
|
|
130
|
+
contentDisposition: 'attachment; filename="report.pdf"'
|
|
131
|
+
});
|
|
132
|
+
```
|
|
57
133
|
|
|
58
|
-
|
|
59
|
-
const { data, error } = await storageClient.updateBucket(
|
|
60
|
-
'test_bucket', // Bucket name
|
|
61
|
-
{ public: false } // Bucket options
|
|
62
|
-
)
|
|
63
|
-
```
|
|
134
|
+
### 文件更新
|
|
64
135
|
|
|
65
|
-
|
|
136
|
+
#### `update(path, fileBody, fileOptions?)`
|
|
66
137
|
|
|
67
|
-
|
|
68
|
-
const { data, error } = await storageClient.emptyBucket('test_bucket')
|
|
69
|
-
```
|
|
138
|
+
替换指定路径的现有文件。
|
|
70
139
|
|
|
71
|
-
|
|
140
|
+
**参数:** 同 `upload` 方法
|
|
72
141
|
|
|
73
|
-
|
|
74
|
-
const { data, error } = await storageClient.deleteBucket('test_bucket')
|
|
75
|
-
```
|
|
142
|
+
**返回:** 同 `upload` 方法
|
|
76
143
|
|
|
77
|
-
|
|
144
|
+
### 创建签名URL
|
|
78
145
|
|
|
79
|
-
|
|
80
|
-
const { data, error } = await storageClient.listBuckets()
|
|
81
|
-
```
|
|
146
|
+
#### `createSignedUrl(path, expiresIn, options?)`
|
|
82
147
|
|
|
83
|
-
|
|
148
|
+
创建具有时效性的安全文件访问链接。
|
|
84
149
|
|
|
85
|
-
|
|
150
|
+
**参数:**
|
|
151
|
+
- `path` (string): 文件路径
|
|
152
|
+
- `expiresIn` (number): 过期时间(秒)
|
|
153
|
+
- `options` (object, 可选): 选项
|
|
154
|
+
- `download` (string | boolean): 是否触发下载,可指定文件名
|
|
155
|
+
- `transform` (TransformOptions): 图片转换选项
|
|
86
156
|
|
|
87
|
-
|
|
88
|
-
|
|
157
|
+
**返回:**
|
|
158
|
+
```typescript
|
|
159
|
+
{
|
|
160
|
+
data: { signedUrl: string };
|
|
161
|
+
error: null;
|
|
162
|
+
} | {
|
|
163
|
+
data: null;
|
|
164
|
+
error: StorageError;
|
|
165
|
+
}
|
|
166
|
+
```
|
|
89
167
|
|
|
90
|
-
|
|
91
|
-
|
|
168
|
+
**示例:**
|
|
169
|
+
```javascript
|
|
170
|
+
// 创建1小时有效的签名URL
|
|
171
|
+
const { data, error } = await storage.createSignedUrl('documents/report.pdf', 3600);
|
|
172
|
+
|
|
173
|
+
// 创建带图片转换的签名URL
|
|
174
|
+
const { data, error } = await storage.createSignedUrl('images/photo.jpg', 3600, {
|
|
175
|
+
transform: {
|
|
176
|
+
width: 300,
|
|
177
|
+
height: 200,
|
|
178
|
+
resize: 'cover',
|
|
179
|
+
quality: 80
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
```
|
|
92
183
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
184
|
+
#### `createSignedUrls(paths, expiresIn, options?)`
|
|
185
|
+
|
|
186
|
+
批量创建签名URL。
|
|
187
|
+
|
|
188
|
+
**参数:**
|
|
189
|
+
- `paths` (string[]): 文件路径数组
|
|
190
|
+
- `expiresIn` (number): 过期时间(秒)
|
|
191
|
+
- `options` (object, 可选): 选项
|
|
192
|
+
|
|
193
|
+
**返回:**
|
|
194
|
+
```typescript
|
|
195
|
+
{
|
|
196
|
+
data: Array<{
|
|
197
|
+
error: string | null;
|
|
198
|
+
path: string | null;
|
|
199
|
+
signedUrl: string;
|
|
200
|
+
}>;
|
|
201
|
+
error: null;
|
|
202
|
+
} | {
|
|
203
|
+
data: null;
|
|
204
|
+
error: StorageError;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
102
207
|
|
|
103
|
-
|
|
208
|
+
### 文件下载
|
|
104
209
|
|
|
105
|
-
|
|
210
|
+
#### `download(path, options?)`
|
|
106
211
|
|
|
107
|
-
|
|
108
|
-
const { data, error } = await storageClient.from('bucket').download('path/to/file')
|
|
109
|
-
```
|
|
212
|
+
从私有存储桶下载文件。
|
|
110
213
|
|
|
111
|
-
|
|
214
|
+
**参数:**
|
|
215
|
+
- `path` (string): 文件路径
|
|
216
|
+
- `options` (object, 可选): 选项
|
|
217
|
+
- `transform` (TransformOptions): 图片转换选项
|
|
112
218
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
219
|
+
**返回:**
|
|
220
|
+
```typescript
|
|
221
|
+
{
|
|
222
|
+
data: Blob;
|
|
223
|
+
error: null;
|
|
224
|
+
} | {
|
|
225
|
+
data: null;
|
|
226
|
+
error: StorageError;
|
|
227
|
+
}
|
|
228
|
+
```
|
|
116
229
|
|
|
117
|
-
|
|
230
|
+
**示例:**
|
|
231
|
+
```javascript
|
|
232
|
+
const { data, error } = await storage.download('documents/report.pdf');
|
|
233
|
+
if (data) {
|
|
234
|
+
// 处理下载的文件数据
|
|
235
|
+
const url = URL.createObjectURL(data);
|
|
236
|
+
window.open(url);
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 文件删除
|
|
241
|
+
|
|
242
|
+
#### `remove(paths)`
|
|
118
243
|
|
|
119
|
-
|
|
244
|
+
删除指定路径的文件。
|
|
245
|
+
|
|
246
|
+
**参数:**
|
|
247
|
+
- `paths` (string[]): 要删除的文件路径数组
|
|
248
|
+
|
|
249
|
+
**返回:**
|
|
250
|
+
```typescript
|
|
251
|
+
{
|
|
252
|
+
data: FileObject[]; // 被删除的文件信息
|
|
253
|
+
error: null;
|
|
254
|
+
} | {
|
|
255
|
+
data: null;
|
|
256
|
+
error: StorageError;
|
|
257
|
+
}
|
|
258
|
+
```
|
|
120
259
|
|
|
121
|
-
|
|
122
|
-
|
|
260
|
+
**示例:**
|
|
261
|
+
```javascript
|
|
262
|
+
const { data, error } = await storage.remove([
|
|
263
|
+
'temp/file1.txt',
|
|
264
|
+
'temp/file2.txt'
|
|
265
|
+
]);
|
|
266
|
+
```
|
|
123
267
|
|
|
124
|
-
|
|
125
|
-
.from('bucket')
|
|
126
|
-
.update('path/to/file', fileBody)
|
|
127
|
-
```
|
|
268
|
+
### 文件列表
|
|
128
269
|
|
|
129
|
-
|
|
270
|
+
#### `list(path?, options?, parameters?)`
|
|
130
271
|
|
|
131
|
-
|
|
272
|
+
列出存储桶中的文件。
|
|
132
273
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
```
|
|
274
|
+
**参数:**
|
|
275
|
+
- `path` (string, 可选): 文件夹路径
|
|
276
|
+
- `options` (SearchOptions, 可选): 搜索选项
|
|
277
|
+
- `parameters` (FetchParameters, 可选): 请求参数
|
|
138
278
|
|
|
139
|
-
|
|
279
|
+
**返回:**
|
|
280
|
+
```typescript
|
|
281
|
+
{
|
|
282
|
+
data: FileObject[]; // 文件列表
|
|
283
|
+
error: null;
|
|
284
|
+
} | {
|
|
285
|
+
data: null;
|
|
286
|
+
error: StorageError;
|
|
287
|
+
}
|
|
288
|
+
```
|
|
140
289
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
290
|
+
**示例:**
|
|
291
|
+
```javascript
|
|
292
|
+
// 列出根目录文件
|
|
293
|
+
const { data, error } = await storage.list();
|
|
294
|
+
|
|
295
|
+
// 搜索特定文件夹的文件
|
|
296
|
+
const { data, error } = await storage.list('documents', {
|
|
297
|
+
limit: 50,
|
|
298
|
+
offset: 0,
|
|
299
|
+
sortBy: {
|
|
300
|
+
column: 'name',
|
|
301
|
+
order: 'asc'
|
|
302
|
+
},
|
|
303
|
+
search: 'report'
|
|
304
|
+
});
|
|
305
|
+
```
|
|
144
306
|
|
|
145
|
-
|
|
307
|
+
## 类型定义
|
|
308
|
+
|
|
309
|
+
### FileBody
|
|
310
|
+
支持以下文件格式:
|
|
311
|
+
- `ArrayBuffer`
|
|
312
|
+
- `ArrayBufferView`
|
|
313
|
+
- `Blob`
|
|
314
|
+
- `Buffer`
|
|
315
|
+
- `File`
|
|
316
|
+
- `FormData`
|
|
317
|
+
- `NodeJS.ReadableStream`
|
|
318
|
+
- `ReadableStream<Uint8Array>`
|
|
319
|
+
- `URLSearchParams`
|
|
320
|
+
- `string`
|
|
321
|
+
|
|
322
|
+
### FileOptions
|
|
323
|
+
```typescript
|
|
324
|
+
interface FileOptions {
|
|
325
|
+
cacheControl?: string | number; // 缓存控制(秒)
|
|
326
|
+
contentType?: string; // 内容类型
|
|
327
|
+
upsert?: boolean; // 是否覆盖已存在文件
|
|
328
|
+
duplex?: string; // 双工流选项
|
|
329
|
+
metadata?: Record<string, any>; // 元数据
|
|
330
|
+
headers?: Record<string, string>; // 额外请求头
|
|
331
|
+
}
|
|
332
|
+
```
|
|
146
333
|
|
|
147
|
-
|
|
148
|
-
|
|
334
|
+
### FileOptionsV2
|
|
335
|
+
```typescript
|
|
336
|
+
interface FileOptionsV2 {
|
|
337
|
+
filePath?: string; // 文件路径(用于 uploadFile)
|
|
338
|
+
cacheControl?: string | number; // 缓存控制(秒)
|
|
339
|
+
contentType?: string; // 内容类型
|
|
340
|
+
upsert?: boolean; // 是否覆盖已存在文件
|
|
341
|
+
contentDisposition?: string; // 内容处置
|
|
342
|
+
}
|
|
343
|
+
```
|
|
149
344
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
345
|
+
### TransformOptions
|
|
346
|
+
```typescript
|
|
347
|
+
interface TransformOptions {
|
|
348
|
+
width?: number; // 宽度(像素)
|
|
349
|
+
height?: number; // 高度(像素)
|
|
350
|
+
resize?: 'cover' | 'contain' | 'fill'; // 调整大小模式
|
|
351
|
+
quality?: number; // 质量(20-100)
|
|
352
|
+
format?: 'origin'; // 格式
|
|
353
|
+
}
|
|
354
|
+
```
|
|
154
355
|
|
|
155
|
-
|
|
356
|
+
### UploadFileData
|
|
357
|
+
```typescript
|
|
358
|
+
interface UploadFileData {
|
|
359
|
+
id: string; // 文件ID
|
|
360
|
+
file_path: string; // 文件路径
|
|
361
|
+
bucket_id: string; // 存储桶ID
|
|
362
|
+
download_url: string; // 下载URL
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### FileObject
|
|
367
|
+
```typescript
|
|
368
|
+
interface FileObject {
|
|
369
|
+
name: string; // 文件名
|
|
370
|
+
bucket_id: string; // 存储桶ID
|
|
371
|
+
owner: string; // 所有者
|
|
372
|
+
id: string; // 文件ID
|
|
373
|
+
updated_at: string; // 更新时间
|
|
374
|
+
created_at: string; // 创建时间
|
|
375
|
+
created_by: string; // 创建者
|
|
376
|
+
updated_by: string; // 更新者
|
|
377
|
+
last_accessed_at?: string; // 最后访问时间
|
|
378
|
+
metadata: Record<string, any>; // 元数据
|
|
379
|
+
buckets: Bucket; // 存储桶信息
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### SearchOptions
|
|
384
|
+
```typescript
|
|
385
|
+
interface SearchOptions {
|
|
386
|
+
limit?: number; // 返回文件数量(默认100)
|
|
387
|
+
offset?: number; // 起始位置
|
|
388
|
+
sortBy?: SortBy; // 排序选项
|
|
389
|
+
search?: string; // 搜索字符串
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### FetchParameters
|
|
394
|
+
```typescript
|
|
395
|
+
interface FetchParameters {
|
|
396
|
+
signal?: AbortSignal; // AbortController 信号
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
## 错误处理
|
|
401
|
+
|
|
402
|
+
所有API方法都返回包含 `data` 和 `error` 的对象。当操作成功时,`error` 为 `null`,`data` 包含返回数据;当操作失败时,`data` 为 `null`,`error` 包含错误信息。
|
|
403
|
+
|
|
404
|
+
```javascript
|
|
405
|
+
const { data, error } = await storage.upload('test.jpg', file);
|
|
406
|
+
|
|
407
|
+
if (error) {
|
|
408
|
+
console.error('操作失败:', error.message);
|
|
409
|
+
// 错误处理
|
|
410
|
+
} else {
|
|
411
|
+
console.log('操作成功:', data);
|
|
412
|
+
// 处理返回数据
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
## 高级用法
|
|
417
|
+
|
|
418
|
+
### 日志记录
|
|
419
|
+
|
|
420
|
+
可以通过设置 `loggerEnabled` 参数启用请求日志记录:
|
|
421
|
+
|
|
422
|
+
```javascript
|
|
423
|
+
const storage = new StorageFileApi(
|
|
424
|
+
'https://your-storage-service.com',
|
|
425
|
+
{ 'Authorization': 'Bearer your-token' },
|
|
426
|
+
'bucket-id',
|
|
427
|
+
'app-id',
|
|
428
|
+
undefined,
|
|
429
|
+
true // 启用日志
|
|
430
|
+
);
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### 错误回调
|
|
434
|
+
|
|
435
|
+
可以设置请求错误回调函数:
|
|
436
|
+
|
|
437
|
+
```javascript
|
|
438
|
+
const storage = new StorageFileApi(
|
|
439
|
+
'https://your-storage-service.com',
|
|
440
|
+
{ 'Authorization': 'Bearer your-token' },
|
|
441
|
+
'bucket-id',
|
|
442
|
+
'app-id',
|
|
443
|
+
undefined,
|
|
444
|
+
false,
|
|
445
|
+
(error) => {
|
|
446
|
+
console.error('请求错误:', error);
|
|
447
|
+
// 自定义错误处理
|
|
448
|
+
}
|
|
449
|
+
);
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### 自定义 fetch
|
|
453
|
+
|
|
454
|
+
可以传入自定义的 fetch 函数:
|
|
455
|
+
|
|
456
|
+
```javascript
|
|
457
|
+
const customFetch = (url, options) => {
|
|
458
|
+
// 自定义 fetch 逻辑
|
|
459
|
+
return fetch(url, options);
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
const storage = new StorageFileApi(
|
|
463
|
+
'https://your-storage-service.com',
|
|
464
|
+
{ 'Authorization': 'Bearer your-token' },
|
|
465
|
+
'bucket-id',
|
|
466
|
+
'app-id',
|
|
467
|
+
customFetch
|
|
468
|
+
);
|
|
469
|
+
```
|
|
156
470
|
|
|
157
|
-
|
|
158
|
-
const { data, error } = await storageClient.from('public-bucket').getPublicUrl('path/to/file')
|
|
159
|
-
```
|
|
471
|
+
## 许可证
|
|
160
472
|
|
|
161
|
-
|
|
473
|
+
MIT License
|
|
162
474
|
|
|
163
|
-
|
|
475
|
+
## 相关链接
|
|
164
476
|
|
|
165
|
-
[
|
|
477
|
+
- [Dataloom 官网](https://dataloom.com)
|
|
478
|
+
- [GitHub 仓库](https://github.com/your-org/dataloom-sdk)
|
|
479
|
+
- [问题反馈](https://github.com/your-org/dataloom-sdk/issues)
|
|
@@ -4,7 +4,7 @@ import { Fetch } from './lib/fetch';
|
|
|
4
4
|
import { type OnRequestErrorType } from './lib/types';
|
|
5
5
|
export interface StorageClientOptions {
|
|
6
6
|
useNewHostname?: boolean;
|
|
7
|
-
|
|
7
|
+
enableLogger?: boolean;
|
|
8
8
|
appId?: string;
|
|
9
9
|
onRequestError: (error: OnRequestErrorType) => void;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageClient.d.ts","sourceRoot":"","sources":["../../src/StorageClient.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,
|
|
1
|
+
{"version":3,"file":"StorageClient.d.ts","sourceRoot":"","sources":["../../src/StorageClient.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACrD;AAED,qBAAa,aAAc,SAAQ,gBAAgB;gBAE/C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAO,EACvC,KAAK,CAAC,EAAE,KAAK,EACb,IAAI,CAAC,EAAE,oBAAoB;IAK7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc;CAWjC"}
|
|
@@ -12,5 +12,6 @@ export declare const isPlainObject: (value: object) => boolean;
|
|
|
12
12
|
export declare const getUpdateFileSize: (file: FileBody) => string;
|
|
13
13
|
export declare const toValidExpiresIn: (expiresIn: number) => number;
|
|
14
14
|
export declare const transformFilePayload: (file: any) => any;
|
|
15
|
+
export declare const sanitizeFileName: (fileName: string) => string;
|
|
15
16
|
export {};
|
|
16
17
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,KAAK,KAAK,GAAG,OAAO,KAAK,CAAC;AAE1B,eAAO,MAAM,YAAY,iBAAkB,KAAK,KAAG,KAWlD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAa,QAAQ,eAAe,CAO/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAAU,OAAO,MAAM,EAAE,GAAG,CAAC,KAAG,OAc5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,OAa7C,CAAC;AAEF,eAAO,MAAM,iBAAiB,SAAU,QAAQ,KAAG,MAqBlD,CAAC;AAEF,eAAO,MAAM,gBAAgB,cAAe,MAAM,WAQjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,SAAU,GAAG,QAe7C,CAAC"}
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,KAAK,KAAK,GAAG,OAAO,KAAK,CAAC;AAE1B,eAAO,MAAM,YAAY,iBAAkB,KAAK,KAAG,KAWlD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAa,QAAQ,eAAe,CAO/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAAU,OAAO,MAAM,EAAE,GAAG,CAAC,KAAG,OAc5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,OAa7C,CAAC;AAEF,eAAO,MAAM,iBAAiB,SAAU,QAAQ,KAAG,MAqBlD,CAAC;AAEF,eAAO,MAAM,gBAAgB,cAAe,MAAM,WAQjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,SAAU,GAAG,QAe7C,CAAC;AAEF,eAAO,MAAM,gBAAgB,aAAc,MAAM,WAGhD,CAAC"}
|
package/dist/main/lib/helpers.js
CHANGED
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.transformFilePayload = exports.toValidExpiresIn = exports.getUpdateFileSize = exports.isPlainObject = exports.recursiveToCamel = exports.resolveResponse = exports.resolveFetch = void 0;
|
|
26
|
+
exports.sanitizeFileName = exports.transformFilePayload = exports.toValidExpiresIn = exports.getUpdateFileSize = exports.isPlainObject = exports.recursiveToCamel = exports.resolveResponse = exports.resolveFetch = void 0;
|
|
27
27
|
const THIRTY_DAYS_IN_SECONDS = 2592000;
|
|
28
28
|
const resolveFetch = (customFetch) => {
|
|
29
29
|
let _fetch;
|
|
@@ -127,4 +127,9 @@ const transformFilePayload = (file) => {
|
|
|
127
127
|
} });
|
|
128
128
|
};
|
|
129
129
|
exports.transformFilePayload = transformFilePayload;
|
|
130
|
+
const sanitizeFileName = (fileName) => {
|
|
131
|
+
const illegalChars = /[\x00-\x1F\x7F:"\\/*?<>|,;]/g;
|
|
132
|
+
return encodeURIComponent(fileName.replace(illegalChars, '')) || 'download_file';
|
|
133
|
+
};
|
|
134
|
+
exports.sanitizeFileName = sanitizeFileName;
|
|
130
135
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAIhC,MAAM,YAAY,GAAG,CAAC,WAAmB,EAAS,EAAE;IACzD,IAAI,MAAa,CAAC;IAClB,IAAI,WAAW,EAAE;QACf,MAAM,GAAG,WAAW,CAAC;KACtB;SAAM,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;QACvC,MAAM,GAAG,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"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"}
|