前言¶
DSH 的输入框默认只接受图片附件。拖入本地文件(如 .txt、.pdf、代码文件)通常会被拒绝,操作无响应。
本插件接管这类被拒绝的拖放操作:提取文件在磁盘上的真实路径,写进输入框,并顺手复制到剪贴板。于是可以直接把路径发给模型去读。
这是什么¶
dsh-drop-path 是一个 DSH 服务端 bundle 插件(cordis 风格)。它通过注册路由并在网页 index 中注入客户端脚本,在 window 的捕获阶段监听拖放事件。利用 DSH Desktop 暴露的 window.__DSH_DESKTOP_FILE_PATH__.getPathForFile(file)(基于 Electron 的 webUtils.getPathForFile)解析出绝对路径。
核心功能¶
- 自动提取并填入本地文件绝对路径。
- 自动复制文件路径到剪贴板。
- 支持非图片文件拖放(如 .txt、.pdf)。
- 提供三种模式切换(自动/总是/关闭)。
- 兼容
textarea与contenteditable输入框。 - 仅桌面端有效(依赖 DSH Desktop 预加载桥)。
安装与启用¶
通过官方安装命令将插件加入指定 profile:
dsh plugin --profile <profile> add dsh-drop-path
安装后刷新网页即可生效。新增 bundle 需重启 DSH 或重新加载 profile。
工作原理与模式¶
本插件通过监听 window 捕获阶段的拖放事件来接管操作,这早于 DSH 自带的 ComposerAttachments 浮层监听,从而避免触发浮层显示,防止浮层卡死的问题。
左下角有一个「路径拖放」开关,用于切换模式:
- 自动(默认):非图片文件拖放时填入路径;纯图片拖放时交回 DSH 处理为附件。
- 总是:所有文件的拖放都填入路径(包括图片)。
- 关闭:不拦截,恢复 DSH 原行为。
状态保存在浏览器的 localStorage 中。
控制台可手动切换模式:
window.__dshDropPath.setMode('off'|'auto'|'always')
window.__dshDropPath.mode() // 读当前模式
window.__dshDropPath.reset() // 清除可能残留的拖拽浮层
使用示例¶
- 将本地文件拖拽到 DSH 桌面端输入框。
- 在浏览器控制台执行上述命令切换模式。
- 运行测试:
node test/logic.test.mjs
注意事项¶
- 仅桌面端有效:普通浏览器出于安全限制无法获取本地路径。本插件在无 preload 桥时会自动降级,不影响 DSH 原行为。
- 冲突处理:通过捕获阶段监听并
stopPropagation(),避免与 DSH 自带拖放浮层打架。 - 热更新:仅修改客户端脚本 (
client/drop-path.js) 时无需重启服务端,刷新页面即可。
总结¶
这个插件解决了在 DSH 中直接引用本地文件路径的痛点。通过简单的拖拽操作,开发者可以将文件路径直接交给模型处理,无需手动复制粘贴。
- 插件目录: dsh-drop-path
- 源码仓库: kongbai-shike/dsh-drop-path