跳到主要内容

PG 模式云存储

阅读前建议先了解 PG 模式概述,明确该模式与传统模式的整体差异。

PG 模式下,云存储与数据库共用同一套权限模型——文件的元数据由 PostgreSQL 的 storage schema 管理,访问权限完全由 RLS Policy 描述。无需再使用 READONLY / PRIVATE 等内置权限标签,也不必再编写云存储专用的 JSON 安全规则——与业务表完全相同的 SQL Policy 同时控制了文件读写

本目录聚焦通用文件 Bucket 的存储、访问与权限管理,适用于图片、视频、文档、压缩包、用户上传内容、静态资源等 File Bucket 场景。

其他云存储类型

CloudBase 还提供 传统模式云存储,可根据环境形态选择合适的云存储类型。

与传统模式的核心差异

PG 模式与传统模式在三件事上有本质区别:

1. Bucket 是一等公民,可按 Bucket 维度做 SQL 级权限控制

  • 传统模式:环境与底层 COS 桶强绑定,开发者面向的是"路径前缀"而非真正意义上的多 Bucket;权限选项也只能在创建桶时挑一种内置模式
  • PG 模式storage.buckets 是 PostgreSQL 中的一张表,每个 Bucket 就是其中一行,可以按 Bucket 维度
    • 配置 public / file_size_limit / allowed_mime_types 等元数据
    • 在 RLS Policy 中用 bucket_id = 'xxx' 直接做条件匹配
    • 通过 SQL 直接增删改查桶元数据,无需控制台或专用 API

2. Object 权限完全基于 RLS,告别 JSON 安全规则

  • 传统模式:用内置权限标签(READONLY / PRIVATE / ADMINWRITE / ADMINONLY / CUSTOM)或独立的 JSON 安全规则描述权限,粒度限于桶 / 路径前缀 / 简单角色
  • PG 模式:所有读写权限由 storage.objects / storage.buckets 上的 RLS Policy 表达。storage.objects 默认 GRANT ALL TO anon, authenticated, service_role——RLS 是唯一闸门。可使用任意 SQL 表达式,跨 schema JOIN 业务表,与数据库权限同语言同语义

3. 不走客户端直传 COS,统一经由 Storage API

为保证元数据、对象、RLS 校验三者的强一致性,PG 模式所有读写经由 Storage API 统一入口,由它在事务中协调 storage.objects 元数据写入与 COS 对象操作,杜绝"COS 有文件但 storage.objects 无记录"或反之的孤儿状态。

维度传统模式PG 模式
客户端上传链路SDK 拿临时签名后直传 COS,后端不参与字节流转SDK → Storage API → COS,由统一入口协调
元数据写入时机COS 回调 / 业务补齐Storage API 在事务中自动写入 storage.objects
owner_id 注入业务侧维护Storage API 写入时自动用 JWT sub 注入,前端无法伪造
RLS 校验不适用INSERT 的 WITH CHECK 在数据库侧拦截,越权请求落不到 COS
删除一致性业务侧自检protect_delete 触发器强制经由 Storage API,先删对象再删行
大文件分片COS 分片直传通过 storage.s3_multipart_uploads 中转表协调的分片上传
文件元信息读取(size / mimetype 等)需额外调用 COS API直接 SELECT metadata FROM storage.objects,与业务表 JOIN
SDK 使用建议

PG 模式下推荐使用原生 Bucket 语义的 SDK / API,例如 JS SDK 的 app.storage.from(bucketId)、CLI 的 tcb storage objects 命令组,或 PG 模式云存储 HTTP API。完整示例见 SDK 使用

差异速览

维度传统模式云存储PG 模式云存储
Bucket 概念与环境强绑定,主要做路径前缀storage.buckets 表的一行,支持 SQL 级控制
权限描述内置权限模式或 JSON 安全规则RLS Policy(SQL)
权限粒度桶级 / 路径前缀 / 简单角色任意 SQL 表达式,可跨表 JOIN
元数据访问控制台 / SDK直接 SQL 查询 storage.objects
与业务数据联动业务自行同步同实例同 schema,可直接 JOIN
上传链路客户端直传 COS客户端 → Storage API → COS
选择方式创建 Bucket 时挑选权限模式由环境类型自动决定,无需选择

PG 环境下,云存储的权限校验路径自动走 RLS,由环境类型决定,开发者无需做任何切换。

整体架构

客户端(Web / 小程序 / 云函数)
│ Authorization: Bearer <Token>

CloudBase 网关
│ 解析 JWT → 设置 role + request.jwt.claims

Storage API
│ 写入 / 读取 storage schema 元数据

PostgreSQL · storage schema ←┐
├─ storage.buckets │ RLS 策略校验
├─ storage.objects │
└─ storage.s3_multipart_uploads ←┘


对象存储后端(COS) ← 文件实体

关键事实

  • 文件实体存在对象存储后端,元数据存在 storage schema
  • storage.buckets / storage.objects 已默认 GRANT ALL TO anon, authenticated, service_role——权限的唯一闸门是 RLS Policy(这是与业务表"双层 GRANT + RLS"模型的差别)
  • 不允许直接 DELETE FROM storage.objects:表上有 protect_delete 触发器,删除必须通过 Storage API 走,避免对象存储残留孤儿对象

阅读路径

你的目标阅读建议
第一次接触,想跑通 Hello World快速体验
设计 Bucket、公开 / 私有访问模型和上传限制Bucket 管理
上传文件、处理覆盖和自定义元数据上传文件
下载文件、生成签名链接或公开 URL访问与下载文件
列出、复制、移动、删除文件管理文件
理解 schema 字段与权限模型权限管理
照着模板写 RLS 策略RLS 策略模式库
查看命名、大小、MIME 和覆盖建议限制与最佳实践
理解 CDN 缓存、Public / Private 缓存差异CDN 加速与缓存
从 Supabase Storage 迁移从 Supabase Storage 迁移
服务端 / 跨语言调用 HTTP APIPG 模式云存储 HTTP API
遇到 403 / 越权 / 直接 DELETE 报错常见问题
内容审核 / 数据万象 / 图片处理与传统模式共用,参见 传统模式云存储

HTTP API

PG 模式云存储提供完整的 RESTful HTTP API,可在任意后端语言中调用:

  • Bucket 操作:创建、列出、获取、更新、删除
  • Object 操作:上传、下载、复制、移动、批量删除、生成/使用签名上传与下载 URL 等

完整接口列表见 PG 模式云存储 HTTP API

下一步