FileSystemHandle 本身不提供读写能力,需配合 getFile() 和 createWritable() 等方法,依赖 File System Access API(仅 Chromium 系列支持,需 HTTPS/localhost)。

HTML5 的 FileSystemHandle 接口本身**不直接提供读写能力**,它只是文件或目录的“句柄”(引用),真正读写需配合 FileSystemFileHandle 的 getFile() 和 createWritable() 等方法,并依赖 **File System Access API**(一个独立于传统 HTML5 的现代浏览器 API)。该 API 目前仅支持 Chromium 内核浏览器(Chrome 86+、Edge 86+、Opera 72+),且必须在安全上下文(HTTPS 或 localhost)中运行。
获取文件句柄并读取内容
用户需主动选择文件(触发权限授予),之后可获取 FileSystemFileHandle,再调用 getFile() 得到 Blob,进而用 FileReader 或 text()/arrayBuffer() 方法读取:
- 调用
showOpenFilePicker({ multiple: false })弹出文件选择器,返回FileSystemFileHandle[] - 对首个句柄调用
getFile()→ 返回Promise<file></file>(注意:此时得到的是标准File对象,不是句柄) - 用
file.text()(读为字符串)或file.arrayBuffer()(读为二进制)完成读取
写入文件需显式创建可写流
写操作不能直接覆盖原文件,而是通过 createWritable() 获取 FileSystemWritableFileStream,再用 write() 和 close() 完成写入。整个过程是异步且需手动控制:
-
const writable = await fileHandle.createWritable();(fileHandle是之前获得的FileSystemFileHandle) -
await writable.write(content);(content可为string、ArrayBuffer或Blob) -
await writable.close();—— 必须调用,否则写入不生效 - 若需追加内容,可在
createWritable({ keepExistingData: true })后先seek()到末尾再写
保存新文件或另存为
没有原始句柄时,可用 showSaveFilePicker() 让用户指定目标路径,返回新的 FileSystemFileHandle,再按上述写入流程操作:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
立即学习“前端免费学习笔记(深入)”;
- 支持设置默认文件名、类型(
suggestedName,types)提升体验 - 返回句柄后立即调用
createWritable(),无需先getFile() - 适用于导出配置、下载生成报告等场景
权限与持久化注意事项
用户授权是逐次的、非永久的(除非启用“持久化权限”),且句柄不可跨会话存储(如 localStorage 中保存句柄对象无效):
- 可通过
await navigator.permissions.query({ name: 'storage-access' })检查当前权限状态 - 调用
await handle.requestPermission({ mode: 'readwrite' })可尝试请求更广权限(但用户可能拒绝) - 如需长期访问,可结合
await navigator.storage.persist()申请持久化存储(仍需用户同意) - 句柄序列化需用
self.structuredClone(handle)(仅在支持 structuredClone 的环境),但恢复后仍需验证权限
不复杂但容易忽略:所有关键方法均为异步,务必使用 async/await 或 .then() 处理 Promise;错误需捕获(如用户取消选择、权限被拒、磁盘满等),避免静默失败。


















