使用 PicGo + Cloudflare R2 打造免费图床 (Mac版)

最近从 Windows 迁移到了 Mac 阵营,为了在写 Markdown 文档时能顺滑地插入图片,重新在 Mac 上配置了 PicGo + Cloudflare R2 作为图床。为了防止自己以后忘记配置细节(特别是 Mac 专属的几个坑位和 S3 插件的新版规则),这里简单记录全过程。

一、为什么选择 Cloudflare R2 做图床?

当我们写文章(比如博客、技术笔记)时,如果图片直接保存在本地,一旦把文章发到网上或者分享给别人,图片就会全部裂掉。我们需要一个“云端大仓库”来存放图片,并生成一个随时随地都能访问的网址。传统云存储和Cloudflare R2 存储桶对比如下:

  1. 传统云存储(图床)和 Cloudflare R2 的对比 以前很多人用阿里云 OSS、腾讯云 COS 或者七牛云做图床。它们确实快,但有一个致命缺点:下行流量收费。 你的文章一旦火了,几千人阅读并加载了你的图片,云厂商就会向你收取高昂的流量费。很多技术博主都曾经历过一觉醒来被天价账单“刺客”击中。

  2. Cloudflare R2 的底层逻辑与传统的对象存储类似,但它依托于 Cloudflare 强大的全球 CDN 网络,推出了一个绝杀特性:下行流量完全免费 (Zero Egress Fees)。 配合它慷慨的免费额度(自带 10GB 容量,每月 1000 万次免费读取),对于个人写作者来说,这不仅是一个纯免费的完美图床,更永远不用担心被恶意刷流量导致破产。此外,R2 全面兼容 S3 标准协议,使得第三方工具(如 PicGo)能非常轻松地接入。

二、准备工作与核心组件

在开始配置前,需要梳理一下整体架构。我们将图片从本地传到云端,再生成链接,需要以下几个核心环节:

核心组件 功能说明 部署/获取方式
PicGo (Mac) 图床的核心搬运工与前台界面。负责监听截图、上传图片、生成 Markdown 链接。 通过 Homebrew 或者在官网安装
S3 插件 充当“翻译官”,让 PicGo 能用标准的 S3 协议与 Cloudflare 沟通。 在 PicGo 插件市场搜索安装
Cloudflare R2 云端图片大仓库(Bucket),负责永久保存图片。 Cloudflare 控制台创建
API 令牌 (Token) PicGo 访问 R2 仓库的“专属门禁卡”。 Cloudflare R2 管理面板生成
自定义域名 绑定的私人域名(如 img.xxx.com),让链接更短且完全可控,未来换图床也无需修改文章。 在自己 Cloudflare DNS 解析配置

详细部署实战:Mac 端的避坑与连通

1. Mac 端环境预置与软件安装 (极易踩坑)

在 Mac 上安装 PicGo,推荐使用 Homebrew,并且需要准备 Node.js 环境以支持插件下载。 打开“终端 (Terminal)”,依次执行:

# 安装 Node.js 环境(PicGo 插件底层依赖)
brew install node
# 一键安装 Mac 版 PicGo
brew install --cask picgo

Mac避坑: 由于 macOS 的安全机制,第一次打开 PicGo 极大概率会报错提示“软件已损坏,无法打开,您应该将它移到废纸篓”。此时千万别删软件,在终端中输入以下命令并输入开机密码解锁,执行完毕后,在“应用程序”中即可正常打开 PicGo。

sudo xattr -r -d com.apple.quarantine "/Applications/PicGo.app"

2. 云端准备:获取 R2 门禁卡

登录 Cloudflare 控制台,进入 R2 页面。

  1. 记住存储桶名称:在列表中找到你创建的 Bucket(例如:my-image-bucket)。
  2. 生成 API 令牌
    • 点击概述页面最下方的 “管理 R2 API 令牌” -> “创建 API 令牌”
    • 权限必须选择 “管理员”“编辑”(只读权限会导致上传失败)。
  3. 保存密钥(极其重要)
    • 创建成功后,页面会显示 Access Key IDSecret Access Key
    • 注意Secret Access Key 只会显示这一次,必须立刻复制并保存下来。如果忘了,只能重新创建新令牌。两台不同电脑可以使用不同的令牌访问同一个桶。

3. 配置 PicGo 穿透与路径管理

打开 PicGo,进入 插件设置,搜索 s3 并安装 picgo-plugin-s3。重启后,进入 图床设置 -> Amazon S3,按照以下逻辑填入数据:

  • 应用密钥 ID (AccessKeyID): 刚刚获取的 R2 Access Key。
  • 应用密钥 (SecretAccessKey): 对应的 Secret Key。
  • 存储空间名 (BucketName): R2 存储桶名称。
  • 存储区域 (Region): auto
  • 自定义节点 (Endpoint): 填写 CF 提供的 S3 终结点,格式为 https://<你的账户ID>.r2.cloudflarestorage.com

核心细节:文件存放与链接生成逻辑。 在新版 S3 插件中,“自定义域名”选项已被整合进 URL 模板。为了兼顾文件整理与个人隐私,需要重点修改以下两项:

1. 自定义输出 URL 模板: 在此处填入 “https://你的自定义域名/{path}”。 {path} 是自动变量,PicGo 上传成功后会将其替换为图片的实际云端路径,拼接出访问链接。

2. 上传的图片路径: 清空默认按年月生成的路径,改为"blog/{md5}.{ext}",这样可以把所有的文件存储在一个目录里,并且可以通过md5哈希算法防止文件名重复。

  • blog/:强制把图片统一归档到云端的 blog 文件夹中,避免根目录杂乱。
  • {md5}.{ext}:极其优雅的命名方式。它会在上传前计算图片的 MD5 哈希值来重命名。这样不仅彻底抹除了原文件名中的个人隐私,还能实现天然去重——同一张图片反复上传,MD5 值一样,云端只会保留一份,绝不产生冗余垃圾。
  • 界面底部的 ForcePathStyleBucket 前缀 均保持关闭状态 no 即可

三、日常使用与云端维护说明

配置完成后,设为默认图床,随便拖拽一张截图进去。如果 Mac 右上角提示“上传成功”,且剪贴板自动获得了 ![](https://自定义域名/blog/xxx.png) 格式的链接,说明打通成功。关于图片的删除逻辑(历史遗留问题):

  • 在PicGO删除图片:直接在 PicGo 的“相册”中点击红色的垃圾桶,PicGo 会带着拥有管理员权限的 API 令牌,自动向 Cloudflare 发送指令,把云端的实体文件一并无缝删除。【实测之下不推荐这么做,好像cloudfare中的图片不会被删除】
  • 在Cloudefare R2存储桶删除:在 PicGo 的“相册”中点击红色的垃圾桶后,建议直接登录 Cloudflare R2 的网页控制台手动勾选删除。不过鉴于 10GB 的容量对于纯文字图片来说深不见底,偶尔残留几张也无伤大雅。