自托管存储
一个与 Postgres 集成的 S3 兼容对象存储服务。
- 使用 Postgres 作为其存储元数据的数据存储
- 授权规则编写为 Postgres 行级安全 (RLS) 策略
- 集成了 S3 作为存储后端(更多后端正在开发中!)
- 极其轻量且高效
创建存储桶
post
/bucket/正文
- name必需字符串
- id可选字符串
- public(公开)可选boolean
- type可选enum(枚举)
- file_size_limit(文件大小限制)可选以下任一选项
- allowed_mime_types(允许的 MIME 类型)可选Array<string>(字符串数组)
响应代码
- 200
- 4XX
响应 (200)
1{2 "name": "avatars"3}获取所有存储桶
get
/bucket/查询参数
- limit可选integer
- offset可选integer
- sortColumn(排序字段)可选enum(枚举)
- sortOrder(排序顺序)可选enum(枚举)
- search可选字符串
响应代码
- 200
- 4XX
响应 (200)
1[2 {3 "id": "bucket2",4 "name": "bucket2",5 "public": false,6 "file_size_limit": 1000000,7 "allowed_mime_types": [8 "image/png",9 "image/jpeg"10 ],11 "owner": "4d56e902-f0a0-4662-8448-a4d9e643c142",12 "created_at": "2021-02-17T04:43:32.770206+00:00",13 "updated_at": "2021-02-17T04:43:32.770206+00:00"14 }15]清空存储桶
post
/bucket/{bucketId}/empty路径参数
- bucketId(存储桶 ID)必需字符串
响应代码
- 200
- 4XX
响应 (200)
1{2 "message": "Empty bucket has been queued. Completion may take up to an hour."3}获取存储桶详情
get
/bucket/{bucketId}路径参数
- bucketId(存储桶 ID)必需字符串
响应代码
- 200
- 4XX
响应 (200)
1{2 "id": "lorem",3 "name": "lorem",4 "owner": "lorem",5 "owner_id": "lorem",6 "public": true,7 "type": "STANDARD",8 "created_at": "lorem",9 "updated_at": "lorem"10}更新存储桶属性
put
/bucket/{bucketId}正文
- public(公开)可选boolean
- file_size_limit(文件大小限制)可选以下任一选项
- allowed_mime_types(允许的 MIME 类型)可选Array<string>(字符串数组)
响应代码
- 200
- 4XX
响应 (200)
1{2 "message": "Successfully updated"3}删除存储桶
delete
/bucket/{bucketId}路径参数
- bucketId(存储桶 ID)必需字符串
响应代码
- 200
- 4XX
响应 (200)
1{2 "message": "Successfully deleted"3}删除对象
delete
/object/{bucketName}/{wildcard}路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
响应代码
- 200
- 4XX
响应 (200)
1{2 "message": "Successfully deleted"3}获取对象
get
/object/{bucketName}/{wildcard}送出对象
路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
响应代码
- 4XX
更新现有键处的对象
put
/object/{bucketName}/{wildcard}路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
响应代码
- 200
- 4XX
响应 (200)
1{2 "Id": "lorem",3 "Key": "avatars/folder/cat.png"4}上传新对象
post
/object/{bucketName}/{wildcard}路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
响应代码
- 200
- 4XX
响应 (200)
1{2 "Id": "lorem",3 "Key": "avatars/folder/cat.png"4}删除多个对象
delete
/object/{bucketName}路径参数
- bucketName(存储桶名称)必需字符串
正文
- prefixes(前缀)必需Array<string>(字符串数组)
响应代码
- 200
- 4XX
响应 (200)
1[2 {3 "name": "folder/cat.png",4 "bucket_id": "avatars",5 "owner": "317eadce-631a-4429-a0bb-f19a7a517b4a",6 "id": "eaa8bdb5-2e00-4767-b5a9-d2502efe2196",7 "updated_at": "2021-04-06T16:30:35.394674+00:00",8 "created_at": "2021-04-06T16:30:35.394674+00:00",9 "last_accessed_at": "2021-04-06T16:30:35.394674+00:00",10 "metadata": {11 "size": 123412 }13 }14]检索对象
get
/object/authenticated/{bucketName}/{wildcard}路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
查询参数
- download(下载)可选字符串
响应代码
- 4XX
生成用于检索对象的预签名 URL
post
/object/sign/{bucketName}/{wildcard}路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
正文
- expiresIn必需integer
- transform(转换)可选object
响应代码
- 200
- 4XX
响应 (200)
1{2 "signedURL": "/object/sign/avatars/folder/cat.png?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJhdmF0YXJzL2ZvbGRlci9jYXQucG5nIiwiaWF0IjoxNjE3NzI2MjczLCJleHAiOjE2MTc3MjcyNzN9.s7Gt8ME80iREVxPhH01ZNv8oUn4XtaWsmiQ5csiUHn4"3}通过预签名 URL 检索对象
get
/object/sign/{bucketName}/{wildcard}路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
查询参数
- download(下载)可选字符串
- token必需字符串
响应代码
- 4XX
生成用于检索对象的多个预签名 URL
post
/object/sign/{bucketName}路径参数
- bucketName(存储桶名称)必需字符串
正文
- expiresIn必需integer
- paths必需Array<string>(字符串数组)
响应代码
- 200
- 4XX
响应 (200)
1[2 {3 "error": "Either the object does not exist or you do not have access to it",4 "path": "folder/cat.png",5 "signedURL": "/object/sign/avatars/folder/cat.png?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJhdmF0YXJzL2ZvbGRlci9jYXQucG5nIiwiaWF0IjoxNjE3NzI2MjczLCJleHAiOjE2MTc3MjcyNzN9.s7Gt8ME80iREVxPhH01ZNv8oUn4XtaWsmiQ5csiUHn4"6 }7]移动对象
post
/object/move正文
- bucketId(存储桶 ID)必需字符串
- sourceKey(源键)必需字符串
- destinationBucket(目标存储桶)可选字符串
- destinationKey(目标键)必需字符串
响应代码
- 200
- 4XX
响应 (200)
1{2 "message": "Successfully moved"3}在特定前缀下搜索对象
post
/object/list/{bucketName}路径参数
- bucketName(存储桶名称)必需字符串
正文
- prefix(前缀)必需字符串
- limit可选integer
- offset可选integer
- sortBy(排序依据)可选object
- search可选字符串
响应代码
- 200
- 4XX
响应 (200)
1[2 {3 "name": "folder/cat.png",4 "bucket_id": "avatars",5 "owner": "317eadce-631a-4429-a0bb-f19a7a517b4a",6 "id": "eaa8bdb5-2e00-4767-b5a9-d2502efe2196",7 "updated_at": "2021-04-06T16:30:35.394674+00:00",8 "created_at": "2021-04-06T16:30:35.394674+00:00",9 "last_accessed_at": "2021-04-06T16:30:35.394674+00:00",10 "metadata": {11 "size": 123412 }13 }14]检索对象信息
get
/object/info/{bucketName}/{wildcard}对象信息
路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
响应代码
- 4XX
复制对象
post
/object/copy正文
- bucketId(存储桶 ID)必需字符串
- sourceKey(源键)必需字符串
- destinationBucket(目标存储桶)可选字符串
- destinationKey(目标键)必需字符串
- metadata可选object
- copyMetadata(复制元数据)可选boolean
响应代码
- 200
- 4XX
响应 (200)
1{2 "Id": "lorem",3 "Key": "folder/destination.png",4 "name": "lorem",5 "bucket_id": "lorem",6 "owner": "lorem",7 "owner_id": "lorem",8 "version": "lorem",9 "id": "lorem",10 "updated_at": "lorem",11 "created_at": "lorem",12 "last_accessed_at": "lorem",13 "metadata": {},14 "user_metadata": {},15 "buckets": {16 "id": "bucket2",17 "name": "bucket2",18 "public": false,19 "file_size_limit": 1000000,20 "allowed_mime_types": [21 "image/png",22 "image/jpeg"23 ],24 "owner": "4d56e902-f0a0-4662-8448-a4d9e643c142",25 "created_at": "2021-02-17T04:43:32.770206+00:00",26 "updated_at": "2021-02-17T04:43:32.770206+00:00"27 }28}从公共存储桶检索对象
get
/object/public/{bucketName}/{wildcard}路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
查询参数
- download(下载)可选字符串
响应代码
- 4XX
获取对象信息
get
/object/info/public/{bucketName}/{wildcard}返回对象信息
路径参数
- bucketName(存储桶名称)必需字符串
- *必需字符串
响应代码
- 4XX