Files
Genarrative/server-rs/crates/platform-oss
kdletters 4863c8c066 后台模板上传(后端):新增批量导入接口与存储/领域支持
- shared-contracts 新增导入 manifest、逐条与结果 DTO(camelCase,拒绝未知字段)
- module-assets 新增 prepare_template_import:新 ID 默认上架,已存在条目就地更新并保留上架状态与未知扩展字段;同一 ID 同版本字节不同时按 CLI 同一句文案拒绝,字节一致时按内容复用既有对象
- platform-oss 为 application/zip 放宽单对象上限到 64 MiB(图片与元数据仍 5 MiB),测试替身同步该口径
- api-server 新增 POST /admin/api/agc-templates/import:multipart(manifest + zip_N/cover_N),逐项校验归档安全性、entry 存在性与封面(按字节嗅探格式,仅 PNG/JPEG/WebP)后才取发布锁
- 锁内流程:CAS 校验 revision → 内容寻址写入 zip/封面/元数据并回读 → 一次提交清单 → 释放锁;断连由独立任务持有,不确定结果保留锁并返回 503
- 路由挂 require_admin_auth 与 200 MiB body 上限,页签权限矩阵与路由契约测试同步
- 新增用例:清单与文件字段校验、归档越界与符号链接拒绝、内容寻址键与封面嗅探、zip 内容类型存储上限
- 新增「后台模板上传」里程碑与实施计划文档
- 验证:cargo test(module-assets 11 项、platform-oss 12 项、api-server 定向 4 项)、cargo fmt --check、check:doc-index、check:encoding、git diff --check
2026-09-21 16:06:23 +08:00
..
2026-07-04 12:03:58 +08:00

platform-oss 平台适配 package 说明

日期:2026-04-20

1. package 职责

platform-oss 是 OSS 平台适配 package,后续负责:

  1. OSS 直传签名、STS、上传策略适配
  2. 对象上传、下载、签名 URL 与 cdn_url 解析适配
  3. 对象元数据、标签与内容 hash 适配
  4. 供 module-assets、module-custom-world 等模块复用的对象存储基础设施能力

2. 当前阶段说明

当前提交已落地最小可用 OSS 基础设施:

  1. PostObject 浏览器直传签名
  2. 旧 /generated-* 公开前缀到 OSS object_key 的兼容映射
  3. 私有对象短期签名读 URL
  4. 私有对象 HEAD Object 探测
  5. 服务端 PutObject 上传 helper
  6. x-oss-meta-* 元数据归一化与大小限制校验
  7. content-type、content-length-range、success_action_status policy 条件生成
  8. PostObject 签名、GetObject 读签名、HEAD Object 和 PutObject 的结构化日志
  9. generated 私有对象上传默认写入 Cache-Control: public, max-age=31536000, immutable
  10. editor-agent/ 服务端内部消息文档前缀,以及仅供后端使用的内部短期读签名能力

当前仍未落地的内容:

  1. STS 真实临时授权下发
  2. multipart 分片上传
  3. 内容 hash 自动计算与标签写入

补充说明:

  1. 当前产品口径为服务器上传 AI 生成资源、Web 端只负责读取。
  2. 因此 STS 不作为默认上传主链,api-server 只暴露禁用式 contract,避免浏览器拿到 OSS 写权限。
  3. 服务端生成资源应优先复用 OssClient::put_object,上传成功后再走对象确认链路写入 asset_object。
  4. 读签名和 HEAD Object 的入参必须直接传 object_key,不要把 bucket 名拼进路径;例如 generated-square-hole-assets/.../image.png 才是正确入参,xushi-dev/... 这类前缀不属于 object_key。
  5. OSS V4 x-oss-date 必须固定为 yyyyMMdd'T'HHmmss'Z',不能依赖 time::Time::to_string();后者在小时小于 10 时可能输出非补零时间,导致签名格式错误。
  6. 结构化日志只记录 provider、operation、bucket、endpoint、object_key / key_prefix、access、content_type、content_length、status、status_class、error_kind 和 elapsed_ms 等排障字段;禁止输出 AccessKey、policy、signature、Authorization header 或完整 signed URL。
  7. 完整 OSS URL 不能当作 object key 传入签名接口;前端收到 https://*.oss-*.aliyuncs.com/generated-* 时应先归一为 legacy public path,再通过 /api/assets/read-url 换取短期 signed URL。
  8. generated 资源缓存的主路径是 OSS 对象头、浏览器 / WebView HTTP 缓存和后续 CDN,不允许改成 api-server 本地磁盘静态资源兜底。
  9. PostObject 是 OSS 基础设施能力,不代表所有前缀都允许浏览器直传;editor-agent/ 只用于画布 Agent 会话消息文档,属于服务端内部前缀,不向浏览器开放写入。
  10. 画布 Agent 消息文档固定使用 editor-agent/{conversationId}.json,由 api-server 通过服务端 PutObject 整体写入,通过内部读签名读取;浏览器只调用会话 API,不直接持有 editor-agent/ 对象的 OSS 写权限、STS 写权限或直传表单。
  11. editor-agent/ 不属于 legacy /generated-* 公开资源前缀,也不应通过通用 /api/assets/read-url 暴露为前端可自行读写的对象地址。
  12. 画布 Agent 消息文档的业务上限、会话内串行写入、失败 generation record 保留等规则由 api-server 与 ADR 约束;platform-oss 只负责对象 key 规范化、签名和服务端上传能力。

3. 边界约束

  1. platform-oss 只承接对象存储平台适配,不承接业务实体状态与业务规则。
  2. 资产状态与对象绑定最终由业务模块和 apps/spacetime-module 管理,前端接口由 apps/api-server 暴露。
  3. 不允许把 OSS SDK、签名逻辑和 URL 策略重新散落到多个业务模块里各自实现。
  4. editor-agent/ 前缀是服务端内部消息文档命名空间,只允许保存 editor-agent/{conversationId}.json 形态的会话级 JSON 文档。
  5. 浏览器直传能力不得用于 editor-agent/ 前缀;若未来需要上传用户附件,应走独立的附件 / 资产前缀和确认链路,不得复用会话消息文档对象。