使用 Cloudflare R2 创建图床
创建存储桶
先准备一个已经开通 R2 的 Cloudflare 账号,然后进入 R2 -> 创建存储桶。
R2 存储桶默认是私有的。图床需要公开读取时,推荐给 Bucket 绑定自己控制的 Custom Domain;r2.dev 更适合临时测试,不建议作为正式博客图片域名。

进入创建的桶,点击设置,下滑点击连接到域,example.com为你在cloudflare上托管的域名,会自动添加记录

等待初始化成功就可以上传图片了并通过url访问了

上传图片后点进去就能看到url

安装 PicGo
PicGo 用于管理图片上传和复制链接。桌面版直接从官方仓库下载安装即可:
安装后打开插件设置,搜索并安装适合 S3 兼容存储的插件。Cloudflare R2 提供 S3 兼容 API,所以后续按 R2 的 Account ID、Access Key、Secret Access Key、Bucket 和自定义域名填写即可。

配置 PicGo
先在 R2 中创建 S3 API 凭据。权限尽量只给图床需要的 Bucket,不要把管理整个 Cloudflare 账户的 Global API Key 填给 PicGo;Access Key / Secret Access Key 只显示和使用在本机配置中,不要写进博客或 Git 仓库。

然后像这样设置,创建完成记得保存密钥

保存密钥后关闭

打开软件,+号添加配置


找到这个S3API
如下填写


PicGo 3 与 AI 自动上传
截至 2026 年 8 月,本机使用 PicGo 3.0.2,原来的 aws-s3 配置和picgo-plugin-s3 插件可以继续使用。当前上传器在 PicGo 顶部显示为Amazon S3 / cloudflare。
PicGo 3 除了图形界面,还提供仅监听本机的 HTTP 服务。只要 PicGo 正在运行,
默认地址为:
http://127.0.0.1:36677
先检查服务是否存活:
Invoke-RestMethod `
-Uri 'http://127.0.0.1:36677/heartbeat' `
-Method Post
正常情况下返回:
{"success":true,"result":"alive"}
上传指定图片
下面的 PowerShell 示例会让 PicGo 使用当前选中的 aws-s3 配置上传图片:
$body = @{
list = @('E:\blog_picture\文章名称\图片.png')
} | ConvertTo-Json -Compress
$result = Invoke-RestMethod `
-Uri 'http://127.0.0.1:36677/upload' `
-Method Post `
-ContentType 'application/json' `
-Body $body
$result
上传成功后,PicGo 会返回类似下面的结果:
{
"success": true,
"result": [
"https://images.example.com/images/2026/08/图片哈希.png"
]
}
也可以直接调用 Windows 版 PicGo:
& 'C:\Users\用户名\AppData\Local\Programs\PicGo\PicGo.exe' `
upload 'E:\blog_picture\文章名称\图片.png'
HTTP API 更适合脚本或 AI 使用,因为它会返回结构化 JSON,不需要依赖剪贴板。
普通网页版 ChatGPT 不能直接访问本机磁盘和
127.0.0.1。只有获得本地文件、
终端或桌面工具权限的 ChatGPT/Codex 才能执行上述操作。
为本地上传接口增加鉴权
PicGo 服务虽然默认只监听 127.0.0.1,但仍建议在 PicGo 配置中设置settings.server.secret。设置后,请求上传接口时需要携带 Bearer Token:
$headers = @{
Authorization = "Bearer $env:PICGO_SERVER_SECRET"
}
$result = Invoke-RestMethod `
-Uri 'http://127.0.0.1:36677/upload' `
-Method Post `
-Headers $headers `
-ContentType 'application/json' `
-Body $body
不要把 PicGo 配置文件、R2 Access Key、Secret Access Key 或本地服务密钥提交到
Git 仓库,也不要在日志、截图和文章中公开这些值。PicGo 本地服务的完整说明见
PicGo CLI Commands 和
PicGo Configuration。
图片更新的正确方式
本图床使用 {year}/{month}/{md5}.{extName} 形式的内容哈希路径。更新一张图片时,
不建议覆盖旧 URL,而应使用以下流程:
- 将修改后的图片保存在本地备份目录。
- 通过 PicGo 上传,得到一个新的哈希 URL。
- 替换 Markdown 文章中的旧图片链接。
- 本地生成博客并检查新图片。
- 发布博客,确认 GitHub Pages 和 Cloudflare Pages 都能正常显示。
- 确认回退不再需要后,再删除旧的 R2 对象。
使用新 URL 可以避开浏览器和 Cloudflare 缓存中的旧内容。
删除 R2 图片时的注意事项
PicGo 的 /upload 接口只负责上传,不提供通用的 R2 删除接口。删除可以在
Cloudflare Dashboard 中完成,也可以使用兼容 S3 API 的工具完成。
本配置的公开 URL 前缀包含 /images/,但它不是 R2 对象键的一部分。例如:
公开 URL:
https://images.example.com/images/2026/08/abcdef.png
R2 对象键:
2026/08/abcdef.png
自动删除前至少应同时校验:
- Bucket 名称正确;
- 对象键正确;
- ETag 与预期图片哈希一致;
- Content-Length 与本地备份大小一致。
删除后还应分别确认 S3 API 返回对象不存在,且公开 URL 返回 404。不要仅根据
文件名进行批量删除,也不要在新页面发布成功前删除旧图片。
给 AI 的最小操作原则
当 ChatGPT 或 Codex 帮助管理图床时,应遵守以下规则:
当前目录分工如下:
E:\blog是原博客和文章内容源,日常新增、修改文章时先操作这里;E:\blog-optimized-20260731是优化、构建和测试副本,文章修改后再同步到这里验证;- 主题、依赖、脚本和构建优化只在优化副本中进行;
- 不要在两个目录间复制
node_modules、public、db.json或.deploy_git。
AI 操作时还应遵守:
- 图片原文件先保存在本地备份目录。
- 上传前确认当前 PicGo 上传器为
aws-s3。 - 只接受
success: true且域名正确的返回 URL。 - 上传后检查 HTTP 状态、Content-Type 和文件大小。
- 将图片链接先插入
E:\blog中的原文章,再同步文章到优化副本测试。 - 不读取、打印或复制 PicGo 中的 R2 密钥。
- 没有明确授权时,不删除或覆盖任何远程对象。
- 更新图片使用新哈希 URL,文章发布成功后再清理旧对象。
评论将在接近此处时加载,也可点击立即加载。