file system access api 是唯一允许网页在用户授权下读写本地文件的现代方案,需https/localhost安全上下文及用户手势触发,chrome/edge支持,firefox/safari不支持;读取用file.text()/json(),保存用showsavefilepicker()+createwritable()。

浏览器不能直接访问本地文件系统,File System Access API 是目前唯一能让网页在用户明确授权下读写本地文件/目录的现代方案——但它不是“随便读”,必须由用户主动触发(比如点击按钮),且不支持后台静默访问。
为什么 showOpenFilePicker() 一调用就报错?
常见错误是未满足调用前提:必须在「安全上下文」(HTTPS 或 localhost)中运行,且调用必须由用户手势(如 click、keydown)发起。直接在 script 标签里执行会抛 SecurityError: Permission denied。
- 确保页面地址是
https://开头,或http://localhost:* - 把调用包在按钮的
onclick或addEventListener('click', ...)里 - 不要在
DOMContentLoaded或setTimeout中自动调用 - Chrome 86+、Edge 91+ 支持;Firefox 和 Safari 当前不支持该 API
readFile() 返回的 Blob 怎么转成字符串或 JSON?
拿到 FileSystemFileHandle 后需先调用 getFile() 获取 File 对象,再用 text() 或 json() 方法读取内容。注意:这些方法返回 Promise,不能用同步方式处理。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
const fileHandle = await window.showOpenFilePicker(); const file = await fileHandle.getFile(); const content = await file.text(); // UTF-8 字符串 // const data = await file.json(); // 自动 parse JSON,失败则 reject
-
file.text()默认按 UTF-8 解码,若文件是 GBK 等编码,需用arrayBuffer()+TextDecoder手动处理 -
file.json()仅适用于合法 JSON 文件,否则抛SyntaxError - 大文件(>100MB)慎用
text(),可能卡住主线程;建议分块读取或用stream()
怎么保存文件到用户选中的位置(而非下载弹窗)?
用 showSaveFilePicker() 获取可写句柄,再通过 createWritable() 写入流。关键点是:它不会覆盖原文件,而是让用户选择路径并确认文件名,适合“另存为”场景。
const handle = await window.showSaveFilePicker({
types: [{
description: 'Text files',
accept: { 'text/plain': ['.txt'] }
}]
});
const writable = await handle.createWritable();
await writable.write(content);
await writable.close();
-
types参数控制文件类型过滤,不传则显示所有类型 -
writable.write()可多次调用追加内容,但必须最后调用close()才真正落盘 - 若用户取消保存,
showSaveFilePicker()会抛AbortError,需catch处理 - 不能直接写入任意路径(如
C:\config\),必须经用户手动选择
这个 API 的核心约束始终没变:一切读写动作都绑定在用户显式授权的句柄上,句柄一旦丢失(比如页面刷新)就无法继续操作——别试图缓存句柄 ID 或绕过选择流程,那不是设计目标,也不被允许。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










