写博客最烦的事之一,就是图片没地方放。这篇记录用 PicGo + GitHub + jsDelivr 搭一套免费、稳定、可长期使用的图床,Mac 上的完整流程(Windows 步骤基本一致)。

一、图床是什么

图床就是专门存放图片的服务器,上传后返回一个 URL,把这个链接写进 Markdown 即可。

1
本地图片 → 上传到图床 → 得到 https://xxx/a.png → 写进文章

图床分国内和国外:

  • 国外(GitHub、SM.MS、Imgur):免费、不限量,但国内访问可能慢
  • 国内(七牛云、阿里云 OSS、腾讯云 COS):速度快,通常需要实名 + 域名,超出免费额度要钱

二、为什么选 GitHub + jsDelivr

方案 费用 速度 稳定性 备注
GitHub + jsDelivr 永久免费 ⭐ 快(CDN 加速) 高 ⭐ 本文方案
SM.MS 免费 一般 一般 免费版有限制,跑路过
七牛云 / 阿里云 OSS 有免费额度 快 高 需实名 + 备案域名
微博 / 知乎图床 免费 快 ❌ 差 有防盗链,随时可能失效
付费图床(又拍云等) 付费 最快 最高 商业项目推荐

GitHub 仓库本身访问慢,但配合 jsDelivr 这个免费 CDN 后,图片会被缓存到全球节点,国内访问速度完全够用。而且数据在自己仓库里,迁移自由、不怕跑路。

三、准备工作

1. 创建 GitHub 仓库

  1. 登录 GitHub,右上角 + → New repository
  2. 填写仓库名(如 image 或 blog-images)
  3. 必须选 Public(公开) —— jsDelivr 只能加速公开仓库
  4. 勾选 Add a README file(避免空仓库)
  5. 点 Create repository 完成

仓库一定要 Public。私有仓库 jsDelivr 无法读取,图片会全部 403。

2. 创建个人 Token

Token 是给 PicGo 用的「钥匙」,让它有权限往你的仓库上传文件。

  1. GitHub 右上角头像 → Settings
  2. 左侧最下方 → Developer settings
  3. Personal access tokens → Tokens (classic)
  4. 右上角 Generate new token → Generate new token (classic)
  5. 填写:
    • Note:随便写,如 PicGo
    • Expiration:选 No expiration(永不过期,省得每年来换)
    • Select scopes:勾选 repo(勾选它会自动选中其下所有子项)
  6. 拉到页面最底部,点绿色的 Generate token

Token 只显示这一次,关掉页面就再也看不到了。立刻复制保存(可以存到备忘录或密码管理器)。

GitHub 现在也提供细粒度 Token,权限更精确、更安全:

  1. Settings → Developer settings → Personal access tokens → Fine-grained tokens
  2. Generate new token
  3. Resource owner 选自己,Repository access 选 Only selected repositories → 选刚建的图床仓库
  4. Permissions → Repository permissions → 找到 Contents → 设为 Read and write
  5. 生成并保存

细粒度 Token 更安全(泄露后只能操作这一个仓库),但 PicGo 对它的兼容性不如 classic 稳定。出问题就换回 classic。

3. 安装 PicGo

PicGo 是一个用于快速上传图片并获取 URL 链接的工具。

1
brew install picgo --cask

或从 GitHub Releases 下载 PicGo-x.x.x.dmg 安装。

到 GitHub Releases 下载 PicGo-Setup-x.x.x.exe,一路下一步即可。

下载 PicGo-x.x.x.AppImage,加执行权限后运行;或用 snap install picgo。

四、配置 PicGo

打开 PicGo → 左侧「图床设置」→ GitHub 图床,逐项填写:

字段 填什么 示例
仓库名 用户名/仓库名 qvp-nvn/image
分支名 主分支名 main(老仓库可能是 master)
Token 上一步复制的 token ghp_xxxxxxxxxxxx
存储路径 仓库里的目录(可空) img/
自定义域名 jsDelivr 地址 https://cdn.jsdelivr.net/gh/用户名/仓库名
设定默认图床 ✅ 打开 —

仓库名要写「用户名/仓库名」完整格式,只写仓库名会上传失败。分支名也要和仓库实际分支一致(去 GitHub 仓库页面左上角确认)。

填完后点「确定」,并把 GitHub 图床设为默认图床。

五、上传测试

三种方式任选:

  1. 拖拽 —— 把图片直接拖进 PicGo 的「上传区」
  2. 剪贴板 —— 截图后按快捷键(⌘ + Shift + P 默认)上传剪贴板图片
  3. 点击上传区 —— 选择文件上传

上传成功后「相册」里会出现图片,右键 → 复制 Markdown 链接,得到:

1
![图片说明](https://cdn.jsdelivr.net/gh/qvp-nvn/image/img/a.png)

把这段粘进文章即可。

六、用 jsDelivr 加速(关键一步)

CDN(Content Delivery Network,内容分发网络)的原理:把内容缓存到离用户最近的节点,用户就近取数据,速度大幅提升。

jsDelivr 是一个免费、公开的 CDN,专门为开源项目服务,可以直接加速 GitHub 仓库里的文件。

配置方法很简单 —— 在 PicGo 的图床配置里填上自定义域名:

1
https://cdn.jsdelivr.net/gh/用户名/仓库名

填了之后,PicGo 返回的链接会从

1
https://raw.githubusercontent.com/用户名/仓库名/main/img/a.png   ← 慢

变成

1
https://cdn.jsdelivr.net/gh/用户名/仓库名/img/a.png               ← 快

注意 jsDelivr 的 URL 里没有分支名。填错(多写一段 /main)会导致 404。

七、在 Typora 中配置 PicGo

配好之后,写文档时截图能自动上传并替换成图床链接,不用手动操作。

  1. Typora → 偏好设置(Preferences)→ 图像
  2. 「插入图片时」选择 上传图片
  3. 「上传服务」选择 PicGo (app)
  4. PicGo 路径填 /Applications/PicGo.app(Windows 填 PicGo 安装路径)
  5. 点「验证图片上传选项」测试,出现成功提示即可

配置成功后,在 Typora 里直接 ⌘ + V 粘贴截图,图片会自动上传并变成 jsDelivr 链接。写博客的效率提升非常明显。

其它编辑器:

编辑器 方案
VS Code 装 PicGo 插件,或直接用 PicGo-Core + vscode-picgo
Obsidian 装 Image auto upload 插件
命令行 npm install picgo -g,然后 picgo upload a.png

八、上传前先压缩

GitHub 仓库建议控制在 1GB 以内,图片累积起来很快。上传前压一下:

工具 用法
TinyPNG 拖拽压缩,免费每月 500 张
Squoosh 在线转 WebP,可实时对比
PicGo 插件 picgo-plugin-compress 上传时自动压缩(在插件设置里搜)

截图建议存 PNG(文字清晰),照片一律转 WebP(体积小 30% 以上)。一张 2MB 的图,博客里加载会明显卡顿。

九、常见问题

图片上传失败

现象 原因 解法
404 / 权限错误 Token 没勾 repo 或已过期 重新生成 Token
仓库不存在 仓库名格式写错 写成 用户名/仓库名
分支错误 填了 master 但实际是 main 去仓库确认分支名
网络超时 GitHub 访问不畅 检查网络,或给 PicGo 配代理

图片能上传但打不开

  • 仓库是私有的 → 改成 Public
  • 自定义域名写错了 → 去掉分支名,格式是 .../gh/用户名/仓库名
  • 刚上传就访问 → jsDelivr 缓存需要几十秒到几分钟,稍等再试

同名文件覆盖

PicGo 默认会按时间戳重命名,正常不会重复。如果手动上传了同名文件,后传的会覆盖先前的 —— 建议开启 PicGo 的「时间戳重命名」。

仓库越来越大

  • GitHub 单个文件上限 100MB,jsDelivr 单文件限制 20MB,仓库建议 1GB 以内
  • 超出后 GitHub 会发邮件提醒,可考虑新建仓库(如 image2)分流

jsDelivr 缓存没更新

改了同名图片但链接内容没变,去 purge.jsdelivr.net 刷新缓存,或干脆换个文件名上传(更省事)。

Token 泄露了怎么办

立刻去 Settings → Developer settings → 找到该 Token → Delete。然后重新生成一个并更新 PicGo 配置。永远不要把 Token 提交到公开仓库或写进文章里。

十、备份与迁移建议

  • 仓库定期 git clone 一份到本地或另一处,图床也是数据
  • 关键图片(如站点 Logo、头像)不要只放在图床,本地留原件
  • 万一 jsDelivr 不可用,改 PicGo 自定义域名即可切换 CDN,仓库里的图片不受影响

这套方案我用了很久,成本为零、速度够用、数据在自己手里。唯一要养成的习惯是:上传前压缩,Token 别外泄。