本站一直使用Typora+PicGo组合来处理markdown和图片的,以往都是用的是阿里云OSS,但最近看到不少受害者一觉醒来被刷掉几千块,为了避免遭受此问题,我还是将所有站点的静态资源从阿里云OSS迁移到CloudFlare R2。本次记录一下PicGo的配置过程。

下载插件

PicGo默认不支持CloudFlare R2,但有插件系统,可以通过别人开发的插件来实现。由于CloudFlare R2兼容S3,所以我们只需要下载S3插件即可。在插件列表中搜索S3:

picgo-plugins

插件版本不同配置也会稍微有些差异。本次PigGo版本为2.4.1、插件版本为s3 1.5.1

新建CloudFlare R2桶

打开CloudFlare的R2,点击创建存储桶

创建存储桶

填写桶名称即可,其他默认。创建好以后,点击刚才新建的桶->设置。自定义域,绑定自己的域名。如果域名在CloudFlare,这一切都是自动的,点点就完事。

创建API Tokens

在桶列表的右侧,Account Details中,点击Manage标签,打开令牌页面。点击创建User Api令牌

创建令牌

创建成功后会出现如下页面。

请注意别关页面,这玩意只显示一次,安全起见也没必要保存,页面停留着即可。

配置CloudFlareR2的API令牌

配置PicGo的S3

打开图床配置界面,新增一个配置,或者修改默认配置。

主界面-图床设置

图床配置名

就是给你的图床起个别名,方便自己选中,例如我的名称就是CloudFlare R2

应用密钥

这里填写刚才创建API页面中的访问密钥ID

应用密钥

填写刚才创建API页面中的机密访问密钥

桶名

填写刚才创建的桶名称

上传文件路径

这里按你需要填写。假设你的自定义域名是https://img.abc.com,你想要在桶中创建一个images/tech(因为我有多个子站点,用于区分)目录,并且将图片以年/月/文件名.后缀保存,那么那就填写images/tech/{year}/{month}/{fullName},具体占位符规则如下:

payload 描述
{year} 当前日期-年
{month} 当前日期-月
{day} 当前日期-日
{hour} 当然日期-时
{minute} 当前日期-分
{second} 当前日期-秒
{millisecond} 当前日期-毫秒
{timestamp} Unix时间戳
{timestampMS} Unix时间戳(毫秒)
{fullName} 完整的文件名(包含后缀)
{fileName} 文件名(不包含后缀)
{extName} 扩展名(不含.
{md5} 图片MD5计算值
{sha1} 图片SHA1计算值
{sha256} 图片SHA256计算值

地区

刚才创建的时候给的是亚太的确,如果你不知道是哪个地区填auto即可。

自定义节点

填写刚才创建的API中的为 S3 客户端使用管辖权地特定的终结点的地址,以r2.cloudflarestorage.com结尾的那个。

代理

可以空着,如果你本地网络无法访问R2,可以填写你得shadowsockets地址。目前R2还未被封禁(拜托各位邻居轻点蹬)。

拒绝无效TLS证书连接

选项切换到yes即可。

ACL访问控制列表

填写public-read即可。

ForcePathStyle

建议开启,因为我们要使用自定义域名去访问图片。

自定义输出URL模板

空着就行

设置输出图片URL前缀

填写绑定到桶上的自定义域名,例如https://img.abc.com

设置输出图片URL后缀

这个一般是处理图片样式、动态裁剪图片的。虽然CloudFlare也支持images来处理图片样式,但是我并没有开启,相对R2,它还是略微贵一点,原本就是为了怕被刷导致破费才换到R2的,没必要开启这个。

Bucket前缀

建议开启。因为我想要的路径是https://img.abc.com/images/tech/2026/01/xxx.webp这种格式,如果不开启,它会自带一个层桶的目录,变成了https://img.abc.com/桶名称/images/tech/2026/01/xxx.webp

总结

有些配置项还是有些歧义,但多试试就可以了。后续写个脚本,批量将阿里云的文件全部迁移到CloudFlare R2