Cloudflare R2 + 域名 + PicList 搭建个人 Markdown 图床教程
Cloudflare R2 + 域名 + PicList 搭建个人 Markdown 图床教程
本文记录如何使用 Cloudflare R2 + 自定义域名 + PicList 搭建一个适合 Markdown、Typora、Obsidian、博客写作使用的个人图床。
最终实现效果如下:
1
本文实际使用配置示例:
本文使用
example.com示例域名,请在实际操作时替换为你自己的域名。
本文实际使用配置:
| 项目 | 配置 |
|---|---|
| 对象存储 | Cloudflare R2 |
| 上传工具 | PicList |
| 图床类型 | AWS S3 |
| 自定义图片域名 | https://image.example.com |
| 上传路径 | img/ |
| 图片命名方式 | 时间戳命名 |
| Markdown 编辑器 | Typora |
1. 为什么选择 Cloudflare R2 做个人图床?
写 Markdown 时,经常需要插入图片。如果图片仍然保存在本地,那么文章一旦迁移到博客、GitHub、其他电脑或服务器,图片路径就很容易失效。
常见方案有几种:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 本地图片 | 简单 | 不方便同步和发布 |
| 公共免费图床 | 上手快 | 稳定性不可控,可能限制外链 |
| GitHub 图床 | 免费,适合少量图片 | 不适合长期大量图片,仓库会膨胀 |
| VPS 自建图床 | 自己可控 | 占用硬盘和流量,需要维护 |
| Cloudflare R2 图床 | 不占 VPS,出站流量免费,自定义域名可控 | 需要配置对象存储和上传工具 |
对个人 Markdown 图床来说,比较推荐:
1Cloudflare R2 对象存储
2+
3自定义域名
4+
5PicList 上传
6+
7Markdown 直链
优点包括:
- 图片使用自己的域名,后期更容易迁移;
- 图片不占用 VPS 硬盘;
- 图片访问不消耗 VPS 流量;
- Cloudflare R2 支持 S3 兼容 API,方便配合 PicList;
- 适合 Typora、Obsidian、VS Code、Hugo、Hexo、WordPress 等写作场景。
2. Cloudflare R2 费用说明
Cloudflare R2 当前免费额度为:
| 项目 | 免费额度 |
|---|---|
| 存储 | 10 GB-month / 月 |
| Class A 操作 | 100 万次 / 月 |
| Class B 操作 | 1000 万次 / 月 |
| 出站流量 | 免费 |
超过免费额度后的 Standard Storage 价格为:
| 项目 | 超出后价格 |
|---|---|
| 存储 | $0.015 / GB-month |
| Class A 操作 | $4.50 / 百万次 |
| Class B 操作 | $0.36 / 百万次 |
Cloudflare R2 定价参考:
https://developers.cloudflare.com/r2/pricing/
对于个人博客和 Markdown 图床来说,一般很难超过免费额度。例如每月上传 1000 张图片,每张 1 MB,总共也只有约 1 GB,仍然在免费额度内。
需要注意:
R2 的免费额度主要适用于 Standard Storage。个人图床建议选择 Standard,不要选择 Infrequent Access。
3. 准备工作
开始前需要准备:
- 一个 Cloudflare 账号;
- 一个已经接入 Cloudflare 的域名;
- 一个用于图床的二级域名;
- PicList 客户端;
- 一个 Markdown 编辑器,例如 Typora。
本文使用的示例:
1图片域名:https://image.example.com
2上传路径:img/
3生成链接:https://image.example.com/img/时间戳.jpg
4. 开通 Cloudflare R2
登录 Cloudflare 后台,进入:
1存储和数据库
2→ R2 对象存储
如果是第一次使用 R2,会看到开通页面,上面会显示免费额度和计费说明。
点击:
1将 R2 订阅添加到我的账户
这里并不是说立刻收费,而是给当前 Cloudflare 账户开通 R2 使用权限。
如果页面显示:
1当前应付总计:$0.00
2每月应付:$0.00 + 额外使用
说明开通本身不收费。只要后续使用量不超过免费额度,一般不会产生费用。
如果 Cloudflare 要求绑定付款方式,这是正常的。它主要是为了以后超出免费额度时计费,不代表开通后立即扣费。
5. 创建 R2 Bucket
开通 R2 后,进入:
1R2
2→ Create bucket
创建一个新的 Bucket。
Bucket 名称可以自定义,例如:
1markdown-img
存储类型选择:
1Standard
不要选择:
1Infrequent Access
原因是个人图床图片会经常被访问,Standard 更适合;并且 R2 免费额度主要针对 Standard Storage。
6. 绑定自定义域名
进入刚刚创建的 Bucket:
1R2
2→ 选择你的 Bucket
3→ Settings
4→ Custom Domains
5→ Connect Domain
填写你的图片域名,例如:
1image.example.com
绑定成功后,图片就可以通过自己的域名访问。
最终访问格式类似:
1https://image.example.com/img/文件名.jpg
Cloudflare 官方文档中也说明,R2 Public Bucket 可以通过自定义域名公开访问,并且自定义域名访问可以结合 Cloudflare Cache 使用。
参考文档:
1https://developers.cloudflare.com/r2/buckets/public-buckets/
注意事项:
- 这个域名需要在 Cloudflare 当前账户下管理;
- 自定义域名绑定成功后,Bucket 中的文件会通过该域名公开访问;
- 图床图片通常是公开的,不要上传隐私图片或敏感数据。
7. 创建 R2 API Token
PicList 需要通过 S3 API 上传图片到 R2,因此需要创建 R2 API Token。
进入 Cloudflare 后台:
1R2
2→ Manage R2 API Tokens
3→ Create API Token
权限建议选择:
1Object Read & Write
作用范围建议选择:
1Apply to specific buckets only
然后选择刚才创建的 Bucket,例如:
1markdown-img
这样即使密钥泄露,也只影响这一个 Bucket,不会影响账户中其他 Bucket。
创建完成后,需要保存:
1Access Key ID
2Secret Access Key
3Endpoint
Endpoint 格式通常是:
1https://<ACCOUNT_ID>.r2.cloudflarestorage.com
注意:
1Secret Access Key 只显示一次,一定要保存好。
如果忘记保存,只能重新创建一个新的 API Token。
8. 安装 PicList
PicList 是一个图片上传和图床管理工具,可以理解为 PicGo 的增强版。它支持 S3 兼容存储,因此可以配合 Cloudflare R2 使用。
PicList 项目地址:
1https://github.com/Kuingsmile/PicList
下载页面:
1https://github.com/Kuingsmile/PicList/releases
Windows 用户通常下载类似下面名称的文件:
1PicList-Setup-x.x.x.exe
不要下载这些:
| 文件后缀 | 说明 |
|---|---|
.dmg | macOS 安装包 |
.AppImage | Linux 版本 |
.deb | Debian / Ubuntu 版本 |
.rpm | Fedora / CentOS 版本 |
.yml | 更新配置文件 |
.blockmap | 更新辅助文件 |
安装完成后打开 PicList。
9. 为什么选择 PicList,而不是 PicGo?
PicGo 也可以用,但更推荐 PicList。
简单理解:
1PicGo:主要负责上传图片
2PicList:上传图片 + 管理云端图片 + 删除图片 + 搜索图片 + 复制多种格式链接
当图床长期使用后,R2 Bucket 里会积累很多图片。此时你可能需要:
- 查看云端已经上传了哪些图片;
- 删除误传的图片;
- 搜索旧图片;
- 批量管理图片;
- 复制 Markdown、HTML、URL 等不同格式链接。
PicList 在这些方面比 PicGo 更适合长期图床管理。
10. 在 PicList 中配置 Cloudflare R2
打开 PicList,进入:
1图床
2→ AWS S3
Cloudflare R2 兼容 S3 API,因此这里选择 AWS S3 是正确的。
10.1 配置名
随便填写,方便自己识别即可,例如:
1Cloudflare R2 图床
10.2 AccessKeyId
填写 Cloudflare R2 API Token 生成的:
1Access Key ID
注意不是 Cloudflare 登录邮箱,也不是 Token 名称。
10.3 SecretAccessKey
填写 Cloudflare R2 API Token 生成的:
1Secret Access Key
这个密钥只显示一次,如果忘记保存,需要重新创建。
10.4 Bucket
填写 R2 Bucket 名称,例如:
1markdown-img
这里不要填写域名。
正确示例:
1markdown-img
错误示例:
1https://image.example.com
10.5 上传路径
建议填写固定目录,例如:
1img/
不要填写:
1{year}/{month}/
原因是实际测试中,PicList 的 AWS S3 配置页面没有把 {year} 和 {month} 自动识别成日期变量,而是直接把它们当成普通文件夹名称。
错误生成结果会变成:
1
因此建议使用稳定的固定路径:
1img/
最终生成的图片链接类似:
1
10.6 Region
Cloudflare R2 通常填写:
1auto
不要填写:
1us-east-1
10.7 自定义节点
这里填写 R2 的 S3 API Endpoint,格式为:
1https://<ACCOUNT_ID>.r2.cloudflarestorage.com
这里不是图片访问域名。
正确示例:
1https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.r2.cloudflarestorage.com
错误示例:
1https://image.example.com
10.8 代理
一般留空即可。
除非本机网络无法连接 Cloudflare,否则不需要设置代理。
10.9 自定义域名
这里填写图片最终访问域名,例如:
1https://image.example.com
不要在最后加 /。
正确示例:
1https://image.example.com
不推荐:
1https://image.example.com/
10.10 网址后缀
一般留空。
10.11 启用 s3ForcePathStyle
建议开启,也就是设置为:
1Yes
Cloudflare R2 使用 S3 兼容接口时,开启这个选项通常更稳。
10.12 拒绝无效 TLS 证书连接
保持关闭即可,也就是:
1No
10.13 上传资源访问策略
可以保持:
1public-read
不过实际是否能通过域名公开访问,主要取决于 R2 Bucket 是否已经正确绑定自定义域名。
10.14 pathStyleAccess 时是否禁用最终 URL 中添加 bucket 前缀
建议开启,也就是设置为:
1Yes
开启后,最终链接会是:
1https://image.example.com/img/文件名.jpg
而不是:
1https://image.example.com/markdown-img/img/文件名.jpg
对于已经绑定自定义域名的图床来说,通常不希望链接里额外出现 Bucket 名称。
11. PicList 推荐配置汇总
| 配置项 | 推荐填写 |
|---|---|
| 图床类型 | AWS S3 |
| 配置名 | Cloudflare R2 图床 |
| AccessKeyId | R2 的 Access Key ID |
| SecretAccessKey | R2 的 Secret Access Key |
| Bucket | 你的 R2 Bucket 名称 |
| 上传路径 | img/ |
| Region | auto |
| 自定义节点 | https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
| 代理 | 留空 |
| 自定义域名 | https://image.example.com |
| 网址后缀 | 留空 |
| s3ForcePathStyle | 开启 |
| 拒绝无效 TLS 证书连接 | 关闭 |
| 上传资源访问策略 | public-read |
| 禁用 URL 中添加 bucket 前缀 | 开启 |
12. 设置图片重命名方式
为了避免图片重名覆盖,建议在 PicList 中开启图片重命名。
推荐使用:
1时间戳命名
这样图片名称会类似:
120260525221946523.jpg
最终图片链接类似:
1
不要长期使用原始文件名,例如:
1315.jpg
2test.jpg
3image.jpg
4截图.png
这些文件名很容易重复,也可能包含中文、空格或特殊符号,影响兼容性。
13. 上传测试
配置完成后,进入 PicList 的上传页面,拖入一张图片进行测试。
上传成功后,PicList 会生成 Markdown 链接,例如:
1
建议进行以下测试:
- 把链接复制到浏览器无痕窗口打开;
- 确认图片不用登录也能访问;
- 把 Markdown 链接粘贴到 Typora 中;
- 确认 Typora 预览能正常显示;
- 再上传一张图片,确认时间戳命名不会覆盖旧文件。
只要无痕窗口能打开,就说明外链公开访问正常。
14. Typora 中如何使用
上传图片后,PicList 会复制 Markdown 格式的图片链接。
在 Typora 中直接粘贴:
1
Typora 会自动显示图片。
也可以给图片添加说明:
1
建议以后文章中的图片统一使用这种格式:
1
15. 常见问题
15.1 上传成功,但 Markdown 中显示不了图片
可能原因:
- 自定义域名没有绑定成功;
- DNS 还没有生效;
- PicList 生成的 URL 不正确;
- 链接里多了 Bucket 名称;
- 图片路径写错。
解决方法:
- 打开浏览器无痕窗口测试图片链接;
- 检查 PicList 的自定义域名是否填写正确;
- 检查是否开启了“禁用 URL 中添加 bucket 前缀”;
- 检查 R2 Bucket 是否已经绑定自定义域名。
15.2 链接里出现 {year}/{month}
如果生成的链接是:
1
说明 PicList 没有把 {year} 和 {month} 当成变量处理,而是当成普通路径。
解决方法:
把上传路径改成固定目录:
1img/
然后重新上传图片。
15.3 链接里多了 Bucket 名称
错误示例:
1https://image.example.com/markdown-img/img/20260525221946523.jpg
理想示例:
1https://image.example.com/img/20260525221946523.jpg
解决方法:
1开启 pathStyleAccess 时禁用最终 URL 中添加 bucket 前缀
也就是把对应选项设置为:
1Yes
15.4 图片文件名会不会重复?
如果使用原始文件名,可能会重复。例如:
11.jpg
2test.jpg
3image.png
建议使用:
1时间戳命名
例如:
120260525221946523.jpg
这样重复概率很低,更适合长期作为图床使用。
15.5 可以用 r2.dev 域名吗?
可以用于测试,但不建议长期使用。
正式图床建议使用自己的自定义域名,例如:
1https://image.example.com
原因是自定义域名更适合长期使用,也方便后期迁移和缓存配置。
16. 安全注意事项
16.1 不要上传隐私图片
图床图片链接通常是公开可访问的,所以不要上传:
- 身份证;
- 银行卡;
- 护照;
- 私人照片;
- 实验原始敏感数据;
- 未公开论文关键图;
- 带有隐私信息的截图。
只要别人拿到链接,就可能访问图片。
16.2 API 密钥不要泄露
R2 API Token 包含上传和修改权限,不要发给别人,也不要写进公开博客。
博客中介绍配置时,可以写:
1Access Key ID:填写你自己的
2Secret Access Key:填写你自己的
不要把真实密钥截图发出来。
16.3 API Token 权限尽量只给单个 Bucket
创建 API Token 时,建议选择:
1Apply to specific buckets only
不要直接给整个账户所有 Bucket 的权限。
17. 是否需要使用 VPS?
如果只是搭建 Markdown 图床,其实不需要把图片存到 VPS 上。
推荐结构是:
1图片存储:Cloudflare R2
2图片访问:自定义域名
3图片上传:PicList
4VPS:不参与图床存储
这样有几个好处:
- VPS 不占硬盘;
- VPS 不跑图床程序,维护成本低;
- 图片访问不消耗 VPS 流量;
- 后期更换 VPS 不影响图片链接。
18. 最终效果
完成后,个人 Markdown 图床的使用流程就是:
11. 截图或保存图片
22. 拖入 PicList
33. PicList 上传到 Cloudflare R2
44. 自动复制 Markdown 图片链接
55. 粘贴到 Typora 或博客 Markdown 文件中
最终链接格式:
1
这套方案的核心优势是:
- 使用自己的域名,链接更可控;
- 图片存储在 Cloudflare R2,不占 VPS 空间;
- R2 没有出站流量费;
- PicList 上传方便,适合 Markdown 写作;
- 时间戳命名可以避免图片重名覆盖;
- 后期迁移和管理都比较方便。
对于个人博客、Markdown 笔记、Typora、Obsidian 和论文写作来说,Cloudflare R2 + 自定义域名 + PicList 是一套非常适合长期使用的个人图床方案。
19. 参考资料
Cloudflare R2 官方文档
https://developers.cloudflare.com/r2/Cloudflare R2 定价
https://developers.cloudflare.com/r2/pricing/Cloudflare R2 Public Buckets
https://developers.cloudflare.com/r2/buckets/public-buckets/PicList GitHub 项目
https://github.com/Kuingsmile/PicListPicList Releases 下载页面
https://github.com/Kuingsmile/PicList/releases