Cloudflare R2 + 域名 + PicList 搭建个人 Markdown 图床教程

Cloudflare R2 + 域名 + PicList 搭建个人 Markdown 图床教程

本文记录如何使用 Cloudflare R2 + 自定义域名 + PicList 搭建一个适合 Markdown、Typora、Obsidian、博客写作使用的个人图床。

最终实现效果如下:

1![](https://image.example.com/img/20260525221946523.jpg)

本文实际使用配置示例:

本文使用 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 直链

优点包括:

  1. 图片使用自己的域名,后期更容易迁移;
  2. 图片不占用 VPS 硬盘;
  3. 图片访问不消耗 VPS 流量;
  4. Cloudflare R2 支持 S3 兼容 API,方便配合 PicList;
  5. 适合 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. 准备工作

开始前需要准备:

  1. 一个 Cloudflare 账号;
  2. 一个已经接入 Cloudflare 的域名;
  3. 一个用于图床的二级域名;
  4. PicList 客户端;
  5. 一个 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/

注意事项:

  1. 这个域名需要在 Cloudflare 当前账户下管理;
  2. 自定义域名绑定成功后,Bucket 中的文件会通过该域名公开访问;
  3. 图床图片通常是公开的,不要上传隐私图片或敏感数据。

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

不要下载这些:

文件后缀说明
.dmgmacOS 安装包
.AppImageLinux 版本
.debDebian / Ubuntu 版本
.rpmFedora / CentOS 版本
.yml更新配置文件
.blockmap更新辅助文件

安装完成后打开 PicList。


9. 为什么选择 PicList,而不是 PicGo?

PicGo 也可以用,但更推荐 PicList。

简单理解:

1PicGo:主要负责上传图片
2PicList:上传图片 + 管理云端图片 + 删除图片 + 搜索图片 + 复制多种格式链接

当图床长期使用后,R2 Bucket 里会积累很多图片。此时你可能需要:

  1. 查看云端已经上传了哪些图片;
  2. 删除误传的图片;
  3. 搜索旧图片;
  4. 批量管理图片;
  5. 复制 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![](https://image.example.com/{year}/{month}/315.jpg)

因此建议使用稳定的固定路径:

1img/

最终生成的图片链接类似:

1![](https://image.example.com/img/20260525221946523.jpg)

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 图床
AccessKeyIdR2 的 Access Key ID
SecretAccessKeyR2 的 Secret Access Key
Bucket你的 R2 Bucket 名称
上传路径img/
Regionauto
自定义节点https://<ACCOUNT_ID>.r2.cloudflarestorage.com
代理留空
自定义域名https://image.example.com
网址后缀留空
s3ForcePathStyle开启
拒绝无效 TLS 证书连接关闭
上传资源访问策略public-read
禁用 URL 中添加 bucket 前缀开启

12. 设置图片重命名方式

为了避免图片重名覆盖,建议在 PicList 中开启图片重命名。

推荐使用:

1时间戳命名

这样图片名称会类似:

120260525221946523.jpg

最终图片链接类似:

1![](https://image.example.com/img/20260525221946523.jpg)

不要长期使用原始文件名,例如:

1315.jpg
2test.jpg
3image.jpg
4截图.png

这些文件名很容易重复,也可能包含中文、空格或特殊符号,影响兼容性。


13. 上传测试

配置完成后,进入 PicList 的上传页面,拖入一张图片进行测试。

上传成功后,PicList 会生成 Markdown 链接,例如:

1![](https://image.example.com/img/20260525221946523.jpg)

建议进行以下测试:

  1. 把链接复制到浏览器无痕窗口打开;
  2. 确认图片不用登录也能访问;
  3. 把 Markdown 链接粘贴到 Typora 中;
  4. 确认 Typora 预览能正常显示;
  5. 再上传一张图片,确认时间戳命名不会覆盖旧文件。

只要无痕窗口能打开,就说明外链公开访问正常。


14. Typora 中如何使用

上传图片后,PicList 会复制 Markdown 格式的图片链接。

在 Typora 中直接粘贴:

1![](https://image.example.com/img/20260525221946523.jpg)

Typora 会自动显示图片。

也可以给图片添加说明:

1![测试图片](https://image.example.com/img/20260525221946523.jpg)

建议以后文章中的图片统一使用这种格式:

1![图片说明](https://image.example.com/img/时间戳.jpg)

15. 常见问题

15.1 上传成功,但 Markdown 中显示不了图片

可能原因:

  1. 自定义域名没有绑定成功;
  2. DNS 还没有生效;
  3. PicList 生成的 URL 不正确;
  4. 链接里多了 Bucket 名称;
  5. 图片路径写错。

解决方法:

  1. 打开浏览器无痕窗口测试图片链接;
  2. 检查 PicList 的自定义域名是否填写正确;
  3. 检查是否开启了“禁用 URL 中添加 bucket 前缀”;
  4. 检查 R2 Bucket 是否已经绑定自定义域名。

15.2 链接里出现 {year}/{month}

如果生成的链接是:

1![](https://image.example.com/{year}/{month}/315.jpg)

说明 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 不要上传隐私图片

图床图片链接通常是公开可访问的,所以不要上传:

  1. 身份证;
  2. 银行卡;
  3. 护照;
  4. 私人照片;
  5. 实验原始敏感数据;
  6. 未公开论文关键图;
  7. 带有隐私信息的截图。

只要别人拿到链接,就可能访问图片。


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:不参与图床存储

这样有几个好处:

  1. VPS 不占硬盘;
  2. VPS 不跑图床程序,维护成本低;
  3. 图片访问不消耗 VPS 流量;
  4. 后期更换 VPS 不影响图片链接。

18. 最终效果

完成后,个人 Markdown 图床的使用流程就是:

11. 截图或保存图片
22. 拖入 PicList
33. PicList 上传到 Cloudflare R2
44. 自动复制 Markdown 图片链接
55. 粘贴到 Typora 或博客 Markdown 文件中

最终链接格式:

1![](https://image.example.com/img/20260525221946523.jpg)

这套方案的核心优势是:

  1. 使用自己的域名,链接更可控;
  2. 图片存储在 Cloudflare R2,不占 VPS 空间;
  3. R2 没有出站流量费;
  4. PicList 上传方便,适合 Markdown 写作;
  5. 时间戳命名可以避免图片重名覆盖;
  6. 后期迁移和管理都比较方便。

对于个人博客、Markdown 笔记、Typora、Obsidian 和论文写作来说,Cloudflare R2 + 自定义域名 + PicList 是一套非常适合长期使用的个人图床方案。


19. 参考资料

  1. Cloudflare R2 官方文档
    https://developers.cloudflare.com/r2/

  2. Cloudflare R2 定价
    https://developers.cloudflare.com/r2/pricing/

  3. Cloudflare R2 Public Buckets
    https://developers.cloudflare.com/r2/buckets/public-buckets/

  4. PicList GitHub 项目
    https://github.com/Kuingsmile/PicList

  5. PicList Releases 下载页面
    https://github.com/Kuingsmile/PicList/releases