aohan83 downloadsAutomatically upload images, audio, video, and PDFs to Aliyun OSS. Store as permanent oss:// references with dynamic signed URL rendering.
An Obsidian plugin that automatically uploads attachments (images, videos, audio, PDFs) to Aliyun OSS, stores them as permanent oss:// references, and renders them with dynamically signed URLs. Solves multi-device sync and sharing challenges for large media files.
Supported formats: images (png/jpg/jpeg/gif/webp/avif/svg/bmp), videos (mp4/mov/webm/mkv/ogv/m4v), audio (mp3/wav/m4a/ogg/flac/aac/opus), and PDF. Markdown, Canvas, and Base files stay in Vault.
main.js, manifest.json, and styles.css from the latest releaseunchanged-attachments-to-oss in your vault's .obsidian/plugins/ directory| Field | Required | Description |
|---|---|---|
region |
Yes | V4 signing region, e.g., cn-hangzhou |
bucketName |
Yes | OSS bucket name |
accessKeyId |
Yes | Aliyun Access Key ID |
accessKeySecret |
Yes | Aliyun Access Key Secret |
endpoint |
No | OSS endpoint hostname (auto-derived from region) |
objectKeyPrefix |
Yes | Prefix for all object keys |
signedUrlExpireSeconds |
No | Signed URL validity (61–604800s, default 3600) |
autoUpload |
No | Toggle auto-upload (default: enabled) |
On first save, you'll set a master password (min 10 chars). The plugin uses PBKDF2-SHA256 to derive an AES-256 key and encrypts AK/SK with AES-GCM. Only ciphertext is stored in Vault.
Ctrl+V to paste and auto-uploadrequestUrl for HTTP (mobile compatible)MIT
【Obsidian 插件】将常用不可变附件(图片/视频/音频/PDF)自动上传到阿里云 OSS,以永久 oss:// 引用保存,并在渲染时动态生成临时签名 URL,解决多端同步和共享问题。
支持的附件格式:图片(png/jpg/jpeg/gif/webp/avif/svg/bmp)、视频(mp4/mov/webm/mkv/ogv/m4v)、音频(mp3/wav/m4a/ogg/flac/aac/opus)和 PDF。Markdown、Canvas 与 Base 保留在 Vault 中,不上传 OSS。
当前版本只使用 OSS 标准公网 Endpoint。根据阿里云官方策略变更公告,2025 年 3 月 20 日后新开通 OSS 服务的用户,通过默认公网域名访问中国内地 Bucket 的上传、下载、删除、HEAD、ListObjects 和 Multipart 等数据 API 会被阻断,并返回 400 PublicEndpointForbidden。
这类用户请在首次配置时选择非中国内地 Region。2025 年 3 月 20 日前已开通 OSS 服务的用户不受该策略影响。已有 oss:// 引用的 Vault 不要直接切换 Region/Bucket;它们属于不可变存储身份,只能通过专用迁移流程变更。
npm install
npm run build
<vault>/.obsidian/plugins/unchanged-attachments-to-oss/
├── main.js
├── manifest.json
└── styles.css(如有)
npm run dev # 监听模式,修改后自动重新构建
构建完成后手动复制 main.js 到 vault 插件目录,在 Obsidian 中重新加载插件即可。
打开插件设置页,填写以下字段:
| 字段 | 必填 | 说明 |
|---|---|---|
region |
是 | V4 签名地域,如 cn-hangzhou;旧格式 oss-cn-hangzhou 会自动归一化 |
bucketName |
是 | Bucket 名称 |
accessKeyId |
是 | Access Key ID |
accessKeySecret |
是 | Access Key Secret |
endpoint |
否 | OSS Endpoint hostname,默认 oss-{region}.aliyuncs.com |
objectKeyPrefix |
是 | 对象 Key 前缀,默认使用 vault 名称且禁止为空或以 / 开头;不能含 . / .. 路径段或占用插件内部命名 |
signedUrlExpireSeconds |
否 | V4 签名 URL 有效期(61–604800 秒),默认 3600 |
autoUpload |
否 | 自动上传开关,默认开启 |
保存时会通过标准 OSS Endpoint 和 Signature V4 访问每次随机的不存在探针 Key,以 404 NoSuchKey 验证 Bucket、凭证和 oss:GetObject 权限。探针不会列举 Bucket、创建对象或下载真实内容。校验失败会阻止保存,并区分提示凭证、权限、Bucket/Region、请求参数或网络问题。
首次保存还需设置至少 10 个字符的主密码。插件使用 Web Crypto PBKDF2-SHA256 派生不可导出的 AES-256 密钥,并以 AES-GCM 加密 AK/SK;Vault 中只同步密文、随机 salt/IV 和算法参数。插件每次加载或热重载后保持锁定,需要在设置页输入主密码解锁。主密码忘记后无法恢复原凭证,只能重新填写 AK/SK 并生成新密文。
Bucket、Region、Endpoint 与 Object Key 前缀共同组成存储身份;前缀中的空格也是 Object Key 的真实内容,不会被插件静默裁剪。首次配置后可轮换 AK/SK 或调整签名有效期;当前版本会阻止直接切换存储身份,因为历史 oss:// 引用不携带 Bucket,静默切换会让旧附件全部失效。
Ctrl+V 粘贴图片/PDF/音视频,自动上传并插入 oss:// 链接替换为签名 URL 显示关闭自动上传后不会接管新的粘贴、拖入或落盘附件;正在进行的自动任务会在下一次 OSS 请求前暂停并保留 staging/分片进度,可稍后手动重试。
Obsidian 原生 PDF 批注功能依赖本地文件,上传到 OSS 后无法使用原生批注。
推荐工作流:
.pdf.md 文件迁移所有本地附件到 OSS(设置页「维护 → 迁移所有本地附件」按钮或命令面板)如果需要继续使用 Obsidian 原生 PDF 批注,请暂停自动上传,并避免执行包含该 PDF 的迁移命令。
.oss-plugin-staging/ 建立内部恢复文件;应用中断后可继续上传或提交已经完成的 Object,任务完成后自动清理 staging。oss:// 中的 Object Key 使用统一 URI 编码,Vault 名含空格、括号或中文时也可可靠渲染、删除和核验。以下运维操作在设置页均提供按钮(「阿里云 OSS 配置」页的凭证区与维护章节),也可通过 Ctrl/Cmd+P 命令面板执行,两者行为一致:
| 操作 | 设置页入口 | 命令面板命令 | 说明 |
|---|---|---|---|
| 测试连接 | 凭证区「测试连接」 | 测试 OSS 连接 | 手动验证凭证有效性 |
| 重试未完成任务 | 维护「立即重试」 | 重试未完成上传任务 | 桌面端和移动端均可恢复待处理任务 |
| 管理本地保险副本 | 维护「查看并管理」 | 管理本地保险副本 | 查看占用、恢复、重试或安全清理保险副本 |
| 清理孤儿分片 | 维护「立即清理」 | 清理孤儿分片上传 | 重置本机日志中超过 24 小时的分片任务;未知远端任务只报告、不自动中止 |
| 核验对象引用 | 维护「开始核验」 | 核验 OSS 对象引用 | 对比 OSS 对象与 Vault 中 Markdown/Canvas/Base 引用 |
| 迁移全部附件 | 维护「开始迁移」 | 迁移所有本地附件到 OSS | 全量迁移 vault 中的本地附件 |
| 迁移指定文件夹 | 维护「选择文件夹」 | 迁移指定文件夹附件到 OSS | 选择性迁移指定文件夹的附件 |
| 归一引用 | 维护「立即归一」 | 将所有引用归一到当前访问域名 | 一次性幂等改写遗留 oss:// 与退役域名引用 |
插件不维护 OSS 引用索引,启动时不会扫描整个 Vault,也不会自动请求 OSS 执行维护。单个 OSS 附件通过附件右键菜单删除;整篇 Markdown 通过文件右键菜单“删除文档并处理 OSS 附件”删除。使用 Obsidian 原生删除时只删除本地文档,不联动 OSS,遗留对象可通过“核验 OSS 对象引用”处理。
requestUrl 收发 HTTP,兼容移动端crypto.subtle) 实现 OSS Signature V4,不依赖 Node.js APIMIT