SuperAPI AI 工具集

taruvi-storage

办公与效率

查看项目

更新于 10-16 04:15

技能介绍

用途

Taruvi Storage 是一个参考模块,用于指导 Taruvi 存储相关的工作流实现,包括存储桶管理、对象上传与下载、可见性控制、批量操作以及配额感知的界面设计。它面向需要在前端应用中集成文件管理能力的开发者,例如构建文件管理器、附件列表或媒体画廊。

该技能不适用于数据库表 CRUD(应使用 taruvi-database 技能)、用户数据(应使用 taruvi-refine-providers 技能)或多资源存储与数据库组合操作(应使用 taruvi-functions 技能)。

主要能力

  • 创建或配置存储桶,包括 app_category、visibility 和 allowed_mime_types。
  • 通过 storageDataProvider 与 useCreate 从前端上传文件。
  • 通过基于路径的 GET API 下载或提供文件。
  • 使用 useDeleteMany 单独或批量删除文件。
  • 构建文件管理器、附件列表或媒体画廊。
  • 对对象列表应用前缀、MIME 类型、大小、日期等过滤器。
  • 在界面中展示存储桶配额使用情况。

使用方式

技能提供了分步说明:首先阅读 ../taruvi-refine-providers/references/storage-provider.md 获取完整存储 API 参考;然后识别所需操作,例如单文件上传使用 PUT|POST /api/apps/{app_slug}/storage/buckets/{bucket}/objects/{key},批量上传使用 batch-upload 端点(每次最多 10 个文件 / 100MB),批量删除使用 batch-delete 端点(每次最多 100 个路径),带过滤的列表使用 GET 加查询参数(prefix、mimetype、size__gte 等)。存储桶可见性在桶级别设置,仅在需要时按对象覆盖。对于配额感知的界面,调用 usage 端点并显示警告,而不是依赖上传阻断。

对于文档或附件流程,默认采用多文件上传界面:允许每次操作选择/上传多个文件;独立处理每个文件并捕获逐文件成功/失败;保持存储对象与元数据记录创建/删除的一致性(在元数据失败时尽可能清理存储);上传/删除后使文件列表失效或重新获取,以反映当前后端状态。

技能还提供了验证清单,包括:存储桶是否设置了 app_category(assets 或 attachments);是否配置了 allowed_mime_types;批量上传是否拆分为 ≤10 个文件 / ≤100MB 的块;批量删除是否拆分为 ≤100 个路径的块;上传界面是否在覆盖现有路径时警告用户(upsert 行为);配额使用是否作为警告而非上传阻断;多文件上传是否报告逐文件状态而非单一聚合成功;当某一步失败时元数据与存储对象状态是否保持一致。

示例代码包括通过 Refine provider hook 上传、批量删除以及带前缀过滤的列表查询。

适用场景

  • 需要在前端应用中实现文件上传、下载、列举和管理的场景。
  • 构建文件管理器、附件列表或媒体画廊。
  • 需要对存储对象应用过滤条件(前缀、MIME 类型、大小、日期)。
  • 需要在界面中展示存储桶配额使用情况。
  • 需要处理多文件上传并报告逐文件状态的文档或附件流程。

限制与注意事项

  • 上传到现有路径会静默替换对象(upsert),API 不发出警告,界面应提示用户。
  • 按对象设置的可见性会覆盖存储桶默认值,私有文件在公共桶中仍保持私有,这是常见的访问问题来源。
  • 批量上传每次最多 10 个文件且不超过 100MB,超出任一限制返回 400 且无部分成功。
  • 批量删除每次最多 100 个路径,与上传不同,批量删除支持部分成功。
  • 配额仅为监控/告警用途,不是硬性上传阻断,API 在超出配额时仍接受上传。
  • allowed_mime_types 拒绝时静默返回通用 400,错误信息不提及 MIME 类型。
  • 创建存储桶必须提供 app_category(assets 或 attachments),否则返回验证错误。
  • 在 useCreate/useList/useDeleteMany 中必须指定 dataProviderName: "storage",否则调用会路由到默认(数据库)provider 并返回令人困惑的“资源未找到”错误。
  • 文档工作流不应仅支持单文件上传,附件流程默认应支持多文件选择。
  • 批量上传不应采用全有或全无的状态报告,应显示逐文件结果并暴露具体失败。