国庆节10月1日
--


自制 Obsidian 插件 Image Manager 的完整使用文档——笔记图片一键直传 CloudFlare-ImgBed 图床、整个文件夹批量上传、文章封面图自动转 WebP 压缩上传、链接自动替换、本地图片安全清理。插件每次更新,这篇文档同步更新。

Image Manager 是我自己写的 Obsidian 插件,专门打通”写笔记 → 图片上库 → 发布博客”这条链路。
它之前走的是 PicList 中转方案(Obsidian → 本地 PicList → 图床),但坑不少:批量传完一个笔记后切到下一个文件再执行命令,经常点了没反应;中间还多依赖一个常驻软件。后来我把插件重写成直连 CloudFlare-ImgBed 图床的 API,PicList 彻底退役。
这篇是我的查阅文档:功能、设置、操作、安全机制、排错都在这。插件每次有新功能或功能修改,我都会同步更新这篇。
| 功能 | 入口 | 说明 |
|---|---|---|
| 上传当前笔记的图片 | 命令面板:上传图片到图床 | 单篇笔记,图片直传图床,链接自动替换 |
| 批量上传文件夹 | 命令面板:批量上传文件夹图片到图床,或文件树右键文件夹 | 递归处理文件夹(含子文件夹)下所有笔记 |
| 上传文章封面图 | 命令面板:上传文章封面图到图床,或文件树右键文件夹 | 封面转 WebP 压缩后上传独立目录,改写 frontmatter image 字段 |
| 下载网络图片到本地 | 命令面板:下载网络图片到本地 | 反向操作:网图下载到笔记同目录 assets/ |
| 上传后自动删除本地图 | 设置开关(默认开启) | 只删本次成功上传的,移入系统回收站;移动端不生效 |
| 移动端使用(v2.4.0) | 左侧栏图标 / 长按笔记 / 命令面板 | 手机上可上传当前笔记图片、下载网图、批量传文件夹;封面图仅桌面端 |
设置位置:Obsidian 设置 → 第三方插件 → Image Manager。
| 设置项 | 我的配置 | 说明 |
|---|---|---|
| 图床地址 | https://img.tsh520.cn | 图床站点地址,末尾带不带 / 都行(插件会自动处理) |
| 管理员账号 | (图床后台的用户名) | 用于调用图床登录接口换取会话 |
| 管理员密码 | (图床后台的密码) | 同上 |
| 上传目录 | blog/article | 图片在图床内存放的相对路径,和博客文章现有图片的目录保持一致 |
| 文件命名方式 | 保留原文件名 | 传上去还是 p001_1.webp 这种原名;重名时图床自动加 (1) 后缀 |
| 上传渠道 | 留空 | 留空使用图床后台配置的默认存储渠道;也可指定 telegram / cfr2 / s3 等 |
| 上传成功后删除本地图片 | 开启 | 详见第四节,有一整套防误删机制;移动端没有系统回收站,该开关在手机上不生效 |
移动端的设置页不会显示这一组设置项(相关命令在手机上也不注册)。
| 设置项 | 我的配置 | 说明 |
|---|---|---|
| 封面图图床目录 | blog/post-covers | 封面上传到图床的独立目录,与文章资源图(blog/article)分开存放 |
| 封面图本地目录(相对库根) | ../public/assets/images/posts | 封面图本地文件所在目录(库根是 src/,向上到博客根再进 public) |
| 封面图压缩模式 | 无损 | 无损:体积约压到 70%;高质量有损 q90:体积约压到 15% |
| 封面上传成功后删除本地文件 | 开启 | 同文章资源图的安全机制,移入系统回收站 |
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 下载目录名 | assets | 网络图片下载到笔记同目录下的这个文件夹 |
| 下载超时时间(秒) | 30 | 单张图片下载的最大等待时间 |
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 上传间隔(毫秒) | 200 | 连续上传两张图之间的间隔,避免图床限流 |
| 日志级别 | 仅错误 | 排查问题时可改成”详细”,日志输出到控制台(Ctrl + Shift + I) |
 或 ![[xxx.webp]])的笔记Ctrl + P → 执行 Image Manager: 上传图片到图床✅ 成功 N 张 / 🗑️ 已删除本地图片 N 张笔记里的链接会被自动替换成图床真实地址,例如:
1上传前:2上传后:一篇一篇传太慢,批量功能一次处理一个文件夹:
Ctrl + P → 批量上传文件夹图片到图床 → 在弹出的搜索框里输入文件夹名(如 MySQL-运维篇)回车批量行为:
⬆️ 批量上传 (3/7)✅ 上传 X 张(Y 篇笔记)/ 🗑️ 已删除 Z 张 / ❗ N 条错误Ctrl + Shift + I → Console)里看,搜 [Image Manager]上传完成后,插件可以把对应的本地图片删掉(省得手动清 assets)。因为删除是危险操作,做了多道保险,宁可漏删、绝不误删:
vault.trash),不是永久删除,随时可恢复被跳过的图片会在汇总里提示 ⚠️ X 张未删除,具体原因在控制台搜 跳过删除。
同一张图被多篇笔记引用时(比如共用一个 assets 文件夹),把引用它的笔记全部上传一遍即可:最后一张图会在”最后一篇引用它的笔记”上传成功后被自动删掉。中途被跳过不用管,那是保护机制在工作。
p094_2(1).webp、(2) 递增,不覆盖旧图、不报错(1) 也一样),保证链接永远有效反向操作,用于把别人文章里的图存到自己库里:
)的笔记Ctrl + P → 下载网络图片到本地assets/ 文件夹,链接替换为本地相对路径批量把文章封面(frontmatter image 字段指向的本地图片)转 WebP 压缩后上传图床,并自动把 image 字段改写为图床 URL。
用法:Ctrl + P → 上传文章封面图到图床 → 选文件夹;或在文件树右键文件夹 → “上传此文件夹的文章封面到图床”。
处理流程(逐篇):
image 字段,筛选出本地路径(/ 开头;已是图床 URL 的自动跳过)public/assets/images/posts/,目录可在设置里改)blog/post-covers(与文章资源图 blog/article 分开,方便随机图、清理等场景区分)image 字段为图床 URL(只动 frontmatter 区间,不重排 YAML、不碰正文示例)压缩效果参考(实测 1536×1024 的 AI 生成封面 PNG):
| 模式 | 单张体积 | 压缩率 |
|---|---|---|
| 无损 | 2.5MB → 1.8MB | 约 70% |
| 高质量有损 q90 | 2.5MB → 0.35MB | 约 14% |
删除的安全机制(与文章资源图同一套哲学):
image 字段已更新为图床 URL,校验不过就不删shell.trashItem),失败则跳过并提示,绝不永久删除v2.4.0 起插件可以在手机上加载运行了。手机上能用的:上传当前笔记的图片、下载网络图片到本地、批量上传文件夹。
手机 Obsidian 没有「从文件安装插件」的入口,最省事的是 BRAT(Beta Reviewers Auto-update Tool,能从 GitHub 仓库直接装插件并自动更新):
BRAT 安装并启用BRAT: Add a beta plugin for testing → 填 tianshihao2003/obsidian-image-manager → Add PluginBRAT: Check for updates to all beta plugins不想装 BRAT 就手动:把 Release 里的 main.js / manifest.json / styles.css 三个文件放进库的 .obsidian/plugins/obsidian-image-manager/。.obsidian 是隐藏目录,iOS 上系统文件 App 看不到,需要用能显示隐藏目录的文件管理器(Documents、FileBrowser 之类),或者在电脑上通过 iCloud Drive 操作。
v2.4.0 起 WebP 编码器的 wasm 已经内嵌进
main.js,不用再单独拷webp_enc*.wasm,所以三个文件就是全部。
| 入口 | 怎么操作 |
|---|---|
| 左侧栏图标 | 打开左侧抽屉 → 点「上传当前笔记图片到图床」/「下载当前笔记网络图片到本地」(只在移动端显示,不占桌面端位置) |
| 长按文件 | 长按笔记 → 「上传此笔记图片到图床」/「下载此笔记网络图片到本地」;长按文件夹 → 批量上传 |
| 命令面板 | 左侧栏 → 命令 → 搜 Image Manager |
📱 N 张本地图片保留(移动端不支持回收站)require("fs"),移动端没有 Node 运行时,会直接 Failed to load plugin| 现象 | 原因与处理 |
|---|---|
弹 ❌ 图床登录失败 HTTP 401 | 图床地址/账号/密码和后台不一致,回设置里核对 |
弹 ❌ 请先打开一个 Markdown 笔记 | 当前活动标签页不是笔记,先打开一篇 md |
| 上传成功但某张图”未删除” | 安全机制生效(多半是其他笔记还在用它),把那篇也传了就好 |
| 图片点击放大预览不显示 | 已修复(早期上传的图 Content-Type 是 octet-stream,新上传的都正常) |
| 封面图”跳过 N 篇” | 该篇 image 为空、已是图床 URL、或不是 / 开头的公共路径(后两者会在控制台记原因) |
| 封面图”本地文件不存在” | image 指向的文件不在设置的封面图本地目录里,检查设置或文件是否被移动 |
| 怎么看详细日志 | Ctrl + Shift + I 打开控制台 → Console → 过滤框输入 Image Manager |
plug-in/Obsidian/obsidian-image-manager/(main.ts + esbuild)main.js / manifest.json / styles.css,BRAT 与手动安装都从这里拿)pnpm build(自动类型检查 + 打包 + 拷贝进 src/content 与 src 两个 Obsidian 库)pnpm smoke(模拟「无 Node 的移动端」和「桌面端」各跑一次 onload,防顶层 require 复发)gh release create vX.Y.Z main.js manifest.json styles.css --title "..." --notes "...",同时把 manifest.json 与 package.json 的版本号一起升——BRAT 靠 manifest 的 version 判断有没有新版main.js(安装只需三个文件),并开源到 GitHub(tianshihao2003/obsidian-image-manager,可用 BRAT 一键安装与更新)shell 模块,改为回退到平台命令移入回收站(Windows 用 PowerShell 系统 API / macOS 用 Finder / Linux 用 gio trash)Failed to construct 'URL': Invalid URL 报错——WebP 编码器的 WASM glue 在 CJS 打包后 import.meta.url 失效,改为注入 CJS 等价的文件 URLimage 指向的本地封面转 WebP 压缩(默认无损,可切有损 q90)后上传到独立目录 blog/post-covers,自动改写 image 字段;成功后可选删除本地封面(多重校验 + 系统回收站)/upload 上传);命令从 checkCallback 改为 callback,根治”切换文件后执行命令无反应”;设置页全新(图床地址/账号/密码/目录/命名方式/渠道)暂未播放



"每一天都是一个新的开始,深呼吸,重新开始。"—— 未知


