首次安装
创建管理员账号和普通用户上传密码。
管理员登录
这里仅供站点管理员使用。
仪表盘
查看图床运行概况与上传统计
Cloudflare Workers 调用量
使用官方 GraphQL Analytics 查询,5 分钟缓存;不会为每个访问写 D1。
最近 30 天上传统计
资源管理(图片 + 文件)
目录 / 相册
存储节点
可同时启用多个 R2 / Hugging Face / S3,并决定哪些节点开放给普通用户选择。
新增存储节点
每个节点都可以拥有独立目录、访问方式和密钥。
Hugging Face Storage Bucket
使用 Storage Bucket 的 S3 凭证:Access Key 应以 HFAK 开头,Endpoint 自动使用 https://s3.hf.co/<namespace>,Region 固定 us-east-1。
Cloudflare R2 S3 API
通用 S3
API 密钥
管理型 API 使用 Authorization: Bearer YOUR_API_KEY。密钥只在创建时显示一次,请妥善保存。
API 接口文档
Base URL:。每个接口均附字段说明、请求示例和返回示例,可一键复制。
通用认证
Authorization: Bearer YOUR_API_KEY
其中 YOUR_API_KEY 是在上方“API 密钥”区域生成的完整密钥,例如 img_xxxxxxxxx。
1. 上传图片 POST /api/v1/images
用途:上传一张图片到指定存储节点,并可选择关联相册及是否展示到公开相册。
Content-Type:multipart/form-data
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
file | 是 | File | 要上传的图片文件本体,例如 JPG、PNG、WebP、GIF。该接口只接受图片。 |
storage_node_id | 否 | 整数 | 存储节点的数据库 ID,决定文件上传到哪一个 R2 / Hugging Face / S3 节点。例如填 2 表示 ID=2 的存储节点。不填时按后台“默认存储节点 / 负载策略”自动选择。可通过 GET /api/v1/storage-nodes 查询。 |
album_id | 否 | 整数 | 相册的数据库 ID,只用于给图片分类。例如后台创建“产品图”相册后得到 ID=3,则上传时传 album_id=3。不填表示“不归属任何相册”。它不是相册名称,也不是目录路径。可通过 GET /api/v1/albums 查询。 |
is_public | 否 | 布尔 | true 表示允许该图片出现在 /gallery/ 公开相册;false 表示不展示。不填时使用后台默认设置。 |
cURL 示例
curl -X POST "$BASE/api/v1/images" \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@photo.jpg" \ -F "storage_node_id=2" \ -F "album_id=3" \ -F "is_public=true"
成功返回示例
{
"success": true,
"id": "f0b8829c-df1a-40bc-8b33-1e81950f6419",
"url": "https://example.com/p/Ab3Kx9Q",
"direct_url": "https://example.com/object/2/uploads/2026/09/14/xxx.jpg",
"mime": "image/jpeg",
"isImage": true,
"storage": "hf",
"storageNodeId": 2,
"storageName": "HF 图片库",
"key": "uploads/2026/09/14/xxx.jpg",
"isPublic": true,
"shortCode": "Ab3Kx9Q"
}| 返回字段 | 说明 |
|---|---|
id | 资源 UUID。删除、修改、移动资源时使用这个值,不是数据库自增 ID。 |
url | 建议对外使用的链接。开启短链接时通常是本站 /p/短码。 |
direct_url | 资源当前的直接访问地址或本站代理地址。 |
storageNodeId | 实际使用的存储节点 ID。 |
key | 对象在 R2 / HF / S3 内的真实对象路径。 |
isPublic | 是否出现在公开相册。 |
2. 上传普通文件 POST /api/v1/files
用途:上传 ZIP、PDF、TXT、MP4、DOCX 等普通文件。普通文件不会进入公开相册。
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
file | 是 | File | 要上传的文件本体。 |
storage_node_id | 否 | 整数 | 目标存储节点 ID。不填时使用后台默认节点或负载策略。 |
curl -X POST "$BASE/api/v1/files" \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@archive.zip" \ -F "storage_node_id=2"
返回:结构与上传图片基本一致,但 isImage=false,并且不会设置公开相册状态。
3. 查询相册 ID GET /api/v1/albums
用途:查询 album_id 应该填写什么。
curl "$BASE/api/v1/albums" \ -H "Authorization: Bearer YOUR_API_KEY"
[
{
"id": 3,
"name": "产品图",
"slug": "产品图",
"image_count": 25
}
]id 就是上传图片接口里的 album_id。例如这里应填写 3。
4. 查询存储节点 ID GET /api/v1/storage-nodes
用途:查询 storage_node_id。返回内容会隐藏 Secret Key。
curl "$BASE/api/v1/storage-nodes" \ -H "Authorization: Bearer YOUR_API_KEY"
[
{
"id": 2,
"name": "HF 图片库",
"type": "hf",
"enabled": true,
"public_selectable": true,
"delivery_mode": "proxy",
"path_prefix": "uploads/{yyyy}/{mm}/{dd}"
}
]这里的 id=2 就是上传接口中的 storage_node_id=2。
5. 获取资源列表 GET /api/v1/resources
用途:分页读取已经上传的资源。
| Query 参数 | 必填 | 说明 |
|---|---|---|
limit | 否 | 每次返回多少条,默认 100,最大 200。 |
cursor | 否 | 分页游标。第一次不要传;下一页直接使用上一次返回的 nextCursor。它不是页码。 |
GET /api/v1/resources?limit=100 GET /api/v1/resources?limit=100&cursor=123 GET /api/v1/images?limit=100 GET /api/v1/files?limit=100
{
"items": [
{
"id": 123,
"uid": "资源 UUID",
"original_name": "photo.jpg",
"mime": "image/jpeg",
"size": 123456,
"is_image": true,
"copy_url": "https://example.com/p/xxxx",
"storage_name": "HF 图片库"
}
],
"nextCursor": 98,
"hasMore": true
}hasMore=true 时,把 nextCursor 传给下一次请求;为 false 时已经到底。
6. 修改资源信息 PATCH /api/v1/resources/:id
:id 是上传接口返回的资源 UUID,例如 f0b8829c-df1a-...。
| JSON 字段 | 必填 | 说明 |
|---|---|---|
original_name | 否 | 修改数据库中显示的资源名称。仅修改显示名称,不自动改变对象存储里的文件名;要改真实对象名请使用“移动 / 重命名”接口。 |
album_id | 否 | 把图片归入某个相册。传相册数字 ID;传 null 或 0 表示移出相册。 |
is_public | 否 | 图片是否展示到公开相册。普通文件固定为 false。 |
curl -X PATCH "$BASE/api/v1/resources/资源UUID" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"original_name": "新名称.jpg",
"album_id": 3,
"is_public": false
}'7. 移动 / 重命名真实对象 POST /api/v1/resources/:id/move
| JSON 字段 | 必填 | 说明 |
|---|---|---|
path | 否 | 目标目录,例如 products/2026/09。这是对象存储中的目录前缀,不是服务器本地磁盘目录。 |
filename | 否 | 目标文件名,例如 demo.webp。填写后会真正更改 R2 / HF / S3 中的对象 Key。 |
original_name | 否 | 同时更新后台展示名称;不填则保留旧展示名称。 |
curl -X POST "$BASE/api/v1/resources/资源UUID/move" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"path": "products/2026/09",
"filename": "demo.webp"
}'8. 删除资源 DELETE /api/v1/resources/:id
删除数据库记录,并删除对应 R2 / Hugging Face / S3 中的真实对象。操作不可恢复。
curl -X DELETE "$BASE/api/v1/resources/资源UUID" \ -H "Authorization: Bearer YOUR_API_KEY"
{ "ok": true }9. 查看存储状态 GET /api/v1/storage/status
| Query 参数 | 必填 | 说明 |
|---|---|---|
probe | 否 | 默认不连接远端,只读取数据库统计;传 probe=1 才实际请求各 R2 / HF / S3 节点测试连通性。频繁调用 probe 会增加外部请求。 |
GET /api/v1/storage/status GET /api/v1/storage/status?probe=1
10. 公开相册接口 GET /api/gallery
无需 API Key。只返回设置为公开展示的图片,不返回普通文件。
| Query 参数 | 说明 |
|---|---|
limit | 每次读取数量,默认 48,最大 100。 |
cursor | 下一页游标。第一次不传,后续使用上一次返回的 nextCursor。 |
GET /api/gallery?limit=48 GET /api/gallery?limit=48&cursor=123
{ "error": "错误说明" }常见 HTTP 状态:400 参数错误、401 API Key/登录无效、403 功能未开放或权限不足、404 资源不存在、409 状态冲突、413 文件过大、415 文件类型不符合接口要求、500 服务端错误。
普通用户上传设置
网站与图库设置
基础设置
Cloudflare Workers 调用量配置
为了不把 Cloudflare API Token 明文存入 D1,请在 Worker 的 Settings → Variables and Secrets 配置以下三个变量: