本地文件句柄(browser-fs-access)
灵感:能力工具箱 fs-access(pkg: browser-fs-access)。
> 小四原创:与「一键下载」不同——本 Skill 走用户授权的文件句柄,可反复读同一文件或写回原路径(浏览器支持时)。
何时使用
- 「选一个本地 JSON/文本再编辑保存回去」
- 「用 File System Access API,兼容不支持的浏览器」
- CRM 草稿「打开本地备份 / 另存为」
硬约束
- 优先
browser-fs-access的fileOpen/fileSave(内置不支持时的<input>/ 下载回退)。 - 必须由用户手势触发(点击按钮),禁止静默读写磁盘。
- 文本默认 UTF-8;大文件先提示体积再读。
- 不声称可绕过沙箱访问任意路径;无授权即失败并友好提示。
- 实现要点注释标 小四原创。
推荐实现
import { fileOpen, fileSave } from 'browser-fs-access'
// 小四原创:打开文本草稿
export async function openLocalText(types?: FilePickerAcceptType[]) {
const file = await fileOpen({
multiple: false,
mimeTypes: ['text/plain', 'application/json'],
extensions: ['.txt', '.json', '.md'],
description: '文本/JSON',
...(types ? { types } : {}),
})
const text = await file.text()
return { file, text, name: file.name }
}
// 小四原创:保存(有 handle 则写回,否则另存)
export async function saveLocalText(
content: string,
suggestedName = 'draft.txt',
handle?: FileSystemFileHandle | null,
) {
const blob = new Blob([content], { type: 'text/plain;charset=utf-8' })
return fileSave(blob, {
fileName: suggestedName.replace(/[\\/:*?"<>|]/g, '_'),
extensions: ['.txt', '.json', '.md'],
}, handle ?? undefined)
}
Agent 步骤
- 安装/引入
browser-fs-access。 - 做「打开」「保存/另存为」两按钮;打开后展示文件名。
- 在不支持的环境验证:仍能通过回退选出文件或下载。
- 与
one-click-filesave区分:无句柄的纯下载用 file-saver。
不要做
- 后台轮询扫描用户磁盘。
- 要求用户关闭安全设置以「万能读写」。
附加
- README.md · reference.md · templates/usage.md