Cloudflare R2
引擎: S3 兼容(AWS SigV4) · 预设: Cloudflare R2
R2 是没有出站费用的 S3 API。对一个产出公开链接的上传工具来说,这几乎是天生的归宿。
配置
设置 → 图床 → + → Cloudflare R2。
| 字段 | 值 |
|---|---|
| Endpoint | https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
| Region | auto |
| Bucket | 只填桶名,例如 assets |
| Access Key ID | 来自 R2 API token |
| Secret Access Key | 同一个 token 给出的密钥 —— 存进钥匙串 |
| 公开访问前缀 | 你的 r2.dev 或自定义域名 —— 见下 |
| 对象键模板 | images/{{date}}/{{uuid}}.{{ext}} |
有两个地方最容易踩坑,都跟 endpoint 有关:
- 它是账号的 origin,不是桶的地址。 不要把桶名接在后面 —— 桶有自己的字段,Dropline 会自己拼成
endpoint/bucket/key。 <ACCOUNT_ID>是一串十六进制,不是你的邮箱或域名。在 Cloudflare 面板的 R2 → 概览里,右侧 S3 API 那个框里能看到,任何 R2 页面的 URL 里也有。
region 永远是 auto。R2 没有 AWS 意义上的 region,只要配置和请求一致,它就接受这个签名。
创建桶和 token
- Cloudflare 面板 → R2 → 创建存储桶。起个名字,位置提示可选。
- R2 → API → 管理 API 令牌 → 创建 API 令牌。
- 权限选 Object Read & Write,范围选应用到特定存储桶,只勾这一个。
- 创建。复制 Access Key ID 和 Secret Access Key —— 密钥只显示一次。
R2 的 token 无法按 key 前缀收窄,只能按桶。想要隔离就一个用途一个桶。
让桶可公开访问
R2 的桶默认是私有的,也没有类似桶策略的东西。两个选择:
托管的 r2.dev 子域 —— 最快,有速率限制,个人用够了。桶 → 设置 → 公开访问 → R2.dev 子域 → 允许访问,你会拿到:
https://pub-<hash>.r2.dev
自定义域名 —— 正经场景该用这个。桶 → 设置 → 自定义域 → 连接域,域名需要在同一个 Cloudflare 账号下的 zone 里。之后流量由 Cloudflare 的 CDN 提供和缓存,没有速率限制:
https://cdn.example.com
无论哪种,把那个 origin 填进公开访问前缀。不填的话,Dropline 返回的是 …r2.cloudflarestorage.com/bucket/key,那是 API 端点,需要签名,浏览器里打不开。
你拿到的链接
https://cdn.example.com/images/2026/08/19/a1f3….png
验证
点测试上传,然后打开链接。如果上传成功但链接返回 401 或 404,说明公开访问没开,或者前缀还填着 API 端点。
常见问题
| 现象 | 原因 |
|---|---|
SignatureDoesNotMatch |
endpoint 后面接了桶名,或者带了尾斜杠 |
上传时 HTTP 401 |
token 没有 Object Read & Write,或者范围限定到了别的桶 |
| 链接要求签名 | 公开访问前缀还是 r2.cloudflarestorage.com 那个端点 |
| 链接 404 | 桶还没开公开访问 |
关于费用
R2 按存储量和操作次数计费,但不收出站流量费。对一个专门产出「别人会去加载的链接」的工具来说,这通常就是几分钱和一笔真账单的区别。