Skip to content

附件 ​

HamsterBase Tasks 支持为任务和项目添加文件附件。文件会被存储在 S3 兼容 的对象存储服务中,由 你自己 提供和管理——应用本身不会代理你的文件,也不会经过任何 HamsterBase 服务器。

使用前请阅读

  • 附件存储在你自己的 S3 服务上,而不是 HamsterBase 的服务器上。 桶的创建、账单与凭据安全都由你负责。
  • 附件文件内容不是端到端加密的。 原始文件会直接上传到你的桶中,能读取该桶的人都可以读到这些文件。请通过桶级别的访问控制来保护它们。
  • S3 配置仅保存在当前设备本地。 不会同步到其他设备。每一台需要上传、下载或预览附件的设备都需要单独配置。
  • 只有附件的 元数据(文件名、大小、MIME 类型、S3 对象 key)会在你的设备之间同步。没有 S3 凭据的设备依然能看到附件列表,但无法读取文件。

你需要准备 ​

任意 S3 兼容的存储都可以使用,常见选择:

  • Amazon S3
  • Cloudflare R2
  • Backblaze B2(S3 兼容端点)
  • MinIO(自部署)
  • 其他 S3 兼容服务 —— 腾讯云 COS、阿里云 OSS、Wasabi、Garage、SeaweedFS 等

对于要使用的桶,你需要知道:

项示例
Endpoint URLhttps://s3.amazonaws.com、https://<account>.r2.cloudflarestorage.com、http://192.168.1.10:9000
Bucketmy-tasks-attachments
Regionus-east-1、auto(R2)等
Access Key ID来自 S3 提供商的 IAM / API 凭据页面
Secret Access Key对应的密钥
Key Prefix(可选)hamsterbase-tasks/ —— 将所有对象限定在一个前缀下
Force Path StyleMinIO 与许多自部署服务需要开启,详见下文

S3 凭据至少需要对该桶有 put、get、head 对象的权限(以及桶本身的 HeadBucket 权限,连接测试会用到)。

配置 ​

附件配置是 按数据库 维护的。如果你有多个数据库,每个数据库都有自己独立的 S3 配置,保存在当前设备本地。

  1. 打开 设置。
  2. 进入 附件(Attachments) 标签页。
  3. 页面顶部会显示当前配置所属的数据库。如果想配置其它数据库,请先切换到对应数据库。
  4. 点击 配置(Configure)(若已存在配置则显示 编辑(Edit))。
  5. 填写表单:
    • Endpoint URL —— 含协议头的完整 URL。AWS S3 用 https://s3.amazonaws.com;R2 使用账户专属的 endpoint;MinIO 用你的服务器地址。
    • Bucket —— 桶名(需要事先创建好)。
    • Region —— 桶所在区域。R2 使用 auto。
    • Access Key ID / Secret Access Key —— 具有 put / get / head 权限的凭据。
    • Key Prefix (可选) —— 应用写入对象时统一加上的前缀。如果该桶被多个工具共享,建议设置一个独立前缀。如果你没写结尾的 /,应用会自动补上。
    • Force Path Style (开关) —— 见下文 Force Path Style。
  6. 点击 Test Connection(测试连接)。应用会对你的桶调用 HeadBucket,成功时显示 ✓ Connection successful。
  7. 点击 Save(保存)。

Force Path Style ​

默认情况下,S3 客户端使用 虚拟主机风格(virtual-hosted-style) 的 URL:https://<bucket>.<endpoint>/<key>。一些服务无法处理这种格式,需要 路径风格(path-style) :https://<endpoint>/<bucket>/<key>。

以下情况建议打开此开关:

  • MinIO —— 几乎总是需要
  • 自部署的 Garage / SeaweedFS / Ceph RGW —— 通常需要
  • 任何使用 <bucket>.<endpoint> 形式时报 DNS 或证书错误的 S3 兼容服务

以下情况保持关闭:

  • Amazon S3
  • Cloudflare R2
  • Backblaze B2
  • 大多数商用 S3 兼容服务

不确定的话,先关着试一次。如果连接测试或上传报 DNS / TLS 相关错误,再打开重试。

清除配置 ​

点击已保存配置旁边的垃圾桶图标会从当前设备清除配置。已经上传到 S3 的文件不会被删除。 在你重新配置可以访问同一个桶和 key prefix 的 S3 凭据之前,这些附件在应用中将无法访问。要真正删除文件,请直接到 S3 服务里删除。

文件如何存储 ​

每个从 HamsterBase Tasks 上传的附件都会写入到你的桶里这样一个确定的 key:

text
{keyPrefix}{databaseId}/attachments/{attachmentId}.{ext}
  • keyPrefix —— 你在表单中设置的 Key Prefix,若没有结尾的 / 会自动补上;没设置就是空字符串。
  • databaseId —— 任务或项目所属的 HamsterBase 数据库 ID。每个数据库都对应前缀下独立的一个目录,因此一个桶可以安全地承载多个数据库。
  • attachmentId —— 本地生成的随机唯一 ID。不会 用原始文件名作为 key,所以同名文件不会冲突,应用内重命名也不会移动 S3 中的对象。
  • ext —— 原始文件扩展名(小写)。没有扩展名的文件就只用裸 key。

举例。 若 Key Prefix 为 hamsterbase-tasks/,数据库 ID 为 db_abc123,文件名为 Q2-report.pdf:

text
hamsterbase-tasks/db_abc123/attachments/V1StGXR8_Z5jdHi6B-myT.pdf

缩略图 ​

对于图片附件(SVG 除外),应用会在上传时本地生成一个小尺寸的 JPEG 缩略图,并以 .thumb.jpg 作为后缀写到原对象旁边:

text
hamsterbase-tasks/db_abc123/attachments/V1StGXR8_Z5jdHi6B-myT.pdf.thumb.jpg

缩略图是“尽力而为”的——即便生成或上传失败,原文件依然会被保存,应用会自动回退到通用文件图标。

删除 ​

应用中的删除是 软删除:元数据被标记为已删除、UI 中隐藏,但 S3 中的对象会保留。要真正释放存储空间,请自己到 S3 中删除对应对象(在 attachments/ 前缀上配置生命周期规则是个方便的做法)。

上传与预览 ​

配置好 S3 之后,每个任务和项目的详情面板都会出现 附件(Attachments) 区域。

  • 点击拖拽区域或将文件拖入即可 添加 附件。
  • 单台设备最多同时上传 3 个 文件,其余会排队等待。
  • 切换数据库或退出登录时,正在进行的上传会被取消。
  • 图片附件会显示缩略图,点击后在预览浮层中查看。
  • 其他类型的文件可以通过下载按钮下载。

任务和项目的附件数量会作为标签的一部分显示在列表项中。

故障排查 ​

连接测试报 Access Denied 或 403。 凭据没有该桶的 s3:HeadBucket 权限,或桶名 / 区域不对。检查 IAM 策略是否包含目标桶。

连接测试报 DNS 或 TLS 错误。 Endpoint 无法以 <bucket>.<endpoint> 的形式访问。打开 Force Path Style 重试。

上传成功但预览打不开。 通常是 CORS 问题。应用是直接在浏览器中调用 GetObject 读文件的,桶需要允许应用所在的来源(origin)。对自部署 S3,配置一份较宽松的 CORS 策略;对 R2 / S3,添加允许 GET、PUT、HEAD 的 CORS 规则。

换设备后附件全部不可访问。 S3 配置是按设备保存的。在新设备的 设置 → 附件 中重新填写相同的 S3 凭据即可。