Markdown Image Host 是一个面向 IntelliJ IDEA Markdown 写作的通用图床插件。打开 .md 或 .markdown 文件,复制图片并在光标处粘贴,插件会把图片从本机直接上传到你配置的对象存储,再插入标准 Markdown 图片链接:
插件没有作者运营的中转服务器。上传链路是 IDEA → 你选择的对象存储;Access Key ID 和 Secret Access Key 由 IntelliJ IDEA Password Safe 保管,不写入项目文件、Markdown 文件或插件仓库。
- 在 IDEA 内写技术文档、博客、README 或知识库,不想先把图片保存到项目目录。
- 已经有华为云 OBS、AWS S3、MinIO 或 Cloudflare R2,希望沿用自己的存储和域名。
- 希望图片上传、对象命名和 Markdown 回填都在本机完成,不依赖第三方图床账号。
| 提供商 | 连接方式 | 公开访问方式 |
|---|---|---|
| 华为云 OBS | OBS 原生 SDK | 勾选“上传对象公开读”,或填写 CDN / 自定义域名 |
| S3 兼容存储(AWS S3、MinIO 等) | S3 API | 勾选“上传对象公开读”,或填写 CDN / 自定义域名 |
| Cloudflare R2 | S3 API | 填写 r2.dev 或自定义公开域名;R2 不使用对象 ACL |
- 构建插件:
./gradlew buildPlugin。 - 在 IDEA 中选择
Settings | Plugins | ⚙ | Install Plugin from Disk...。 - 选择
build/distributions/下生成的插件 ZIP,安装后重启 IDEA。
- 打开
Settings | Tools | Markdown Image Host。 - 选择存储提供商,填写 Endpoint、Bucket、对象前缀、Access Key ID 和 Secret Access Key。
- 填写能被 Markdown 阅读器访问的公开访问域名。可以是 CDN、自定义域名,或厂商提供的公开域名。
- 点击 Apply 保存配置,再点击 测试图床上传。测试对象会写入
<对象前缀>/_tests/,不会修改当前 Markdown 文件。
- 在
.md/.markdown编辑器中把光标放到目标位置。 - 将图片复制到系统剪贴板后直接按 IDEA 的粘贴快捷键(macOS:
⌘V,Windows/Linux:Ctrl+V)。 - 插件在后台上传 PNG;成功后在原光标位置插入
,失败时只显示本地通知,不插入失效链接。
插件只接管“Markdown 文件 + 剪贴板中存在图片”的粘贴动作;普通文本粘贴、非 Markdown 文件和未完成配置不会被拦截。
Cloudflare R2 使用 https://<ACCOUNT_ID>.r2.cloudflarestorage.com 作为 Endpoint、auto 作为 Region,并勾选 Path-style S3 地址;同时必须在 R2 Bucket 侧开启公开访问并配置公开域名。R2 不使用对象 ACL,插件不会尝试发送 public-read ACL。
以下仅用于说明字段含义,不是可用凭据:
Provider: Cloudflare R2
Endpoint: https://<ACCOUNT_ID>.r2.cloudflarestorage.com
Region: auto
Bucket: <YOUR_BUCKET>
Object prefix: md-images
Public domain: https://img.example.com
Access Key ID: <R2_ACCESS_KEY_ID>
Secret Access: <R2_SECRET_ACCESS_KEY>
Path-style: enabled
IDEA Markdown 图片粘贴
│
▼
MarkdownImageHostPasteProvider(识别 Markdown + 图片剪贴板)
│
▼
ImageHostService(对象命名、Password Safe 凭据读取、上传入口)
│
├── HuaweiObsImageHostProvider(OBS 原生 SDK)
└── S3CompatibleImageHostProvider(AWS S3 / MinIO / Cloudflare R2)
│
├── 上传成功:公开 URL → 回填 Markdown 图片链接
└── 上传失败:本地 IDEA 通知,不修改文档
Markdown 层只依赖“本地文件上传后返回 URL”这一接口;新增图床时只需实现 ImageHostProvider,不会影响粘贴、设置页或 Markdown 回填逻辑。
- 图片只发送到用户在设置页选择的对象存储;插件不提供图片中转、代理、账号系统或遥测服务。
- Access Key ID 和 Secret Access Key 存在 IDEA Password Safe。不要把密钥写进 README、
.env、Gradle 文件、截图或 Issue。 - 插件会在本地创建临时 PNG,上传完成或失败后删除临时文件。
- “上传对象公开读”会让知道 URL 的人读取图片。生产环境建议使用最小权限凭据、独立 Bucket 和 CDN/自定义域名,并按存储厂商策略配置公开访问。
- R2 的公开访问由 Bucket 域名策略控制,不要把 S3 Endpoint 当作 Markdown 图片域名。
- 仅处理系统剪贴板图片,统一编码为 PNG。
- 上传失败不插入链接。
- 当前不支持图片压缩、图片管理、多账号、签名 URL、断点续传、拖拽上传和批量上传。
- 当前对象名按 UTC 日期分区并追加 UUID,适合长期引用但不提供去重或删除管理。
- 未来可评估图片压缩、上传前预览、失败重试、批量粘贴、多配置切换和对象清理工具。
./gradlew clean test
./gradlew verifyPlugin
./gradlew verifyPluginStructure
./gradlew buildPlugin构建产物位于 build/distributions/。仓库不应提交 build/、IDE 配置、Password Safe 导出文件或任何真实云存储凭据。
请在 GitHub Issues 提供 IDEA 版本、插件版本、存储提供商和脱敏后的错误信息。不要在 Issue 中粘贴 Access Key、Secret Access Key、Bucket 私有链接或业务图片。