需启用Chrome实验性开关、手动授予权限、使用启动参数或开发者工具调试,才能在本地HTML中调用showDirectoryPicker等API。

如果您在开发本地 HTML 页面时,尝试通过 JavaScript 调用 showDirectoryPicker、showOpenFilePicker 等 Web File System API,但浏览器拒绝授予访问权限或提示“Permission denied”,则可能是由于 Chrome 对本地文件系统(File System Access API)的默认策略限制。以下是解决此问题的步骤:
一、启用文件系统访问权限开关
Chrome 浏览器需手动启用实验性功能开关以支持现代文件系统 API 的完整行为,该开关控制底层权限模型是否允许页面请求持久化文件访问。
1、在 Chrome 地址栏中输入 chrome://flags/#file-system-access 并回车。
2、在搜索框中输入 file system access,定位到“File System Access API”条目。
3、将下拉菜单从“Default”更改为 Enabled。
4、点击右下角的“Relaunch”按钮重启浏览器。
二、为特定站点手动授予文件系统权限
即使 API 已启用,Chrome 仍按站点粒度独立管理文件系统访问授权,用户必须对当前域名显式授予权限,且该权限不会跨协议(如 http:// 与 https://)或端口共享。
1、访问目标网站(例如 http://localhost:8000 或 file:///C:/project/index.html)。
2、点击地址栏左侧的锁形图标(或“不安全”标识),打开站点信息面板。
3、点击“站点设置”进入权限配置页。
4、向下滚动至“权限”区域,找到 Local file system 项(若未显示,说明 Flags 未正确启用)。
5、将该权限设为 Allow,关闭设置页后刷新页面。
三、使用 --unsafely-treat-insecure-origin-as-secure 启动参数(仅限本地开发)
当在 http://localhost 或 http://127.0.0.1 等非 HTTPS 环境下调试时,Chrome 默认禁止文件系统 API,该参数可临时解除对指定不安全源的限制。
1、右键 Chrome 快捷方式,选择“属性”。
2、在“目标”字段末尾添加空格后追加:--unsafely-treat-insecure-origin-as-secure="http://localhost:8000" --user-data-dir="C:/chrome-local-dev"(注意替换端口号并确保 --user-data-dir 指向全新空白目录)。
3、点击“确定”保存,双击该快捷方式启动新实例。
4、访问 http://localhost:8000 后即可调用 showOpenFilePicker() 等方法而无权限拦截。
四、通过开发者工具强制模拟权限状态
在调试阶段,可绕过 UI 授权流程,直接在 Application 面板中注入权限标记,用于快速验证代码逻辑是否受权限阻断影响。
1、打开目标页面,按 F12 打开开发者工具。
2、切换至“Application”选项卡。
3、在左侧边栏展开“Clear storage”,点击右侧“Clear site data”下方的“View permissions”链接(若存在)。
4、若未显示,可在 Console 中执行:navigator.permissions.query({name:'local-file-system'}) 查看当前状态。
5、如返回 {state: "prompt"},说明尚未授权;返回 {state: "granted"} 表示已生效。
五、使用 file:// 协议时的替代方案:启动带标志的独立 Chrome 实例
直接双击打开本地 HTML 文件(file:///)时,Chrome 默认完全禁用文件系统 API,唯一可靠方式是通过命令行参数启动一个隔离的、专用于本地开发的浏览器进程。
1、新建文本文件,输入以下内容(Windows 示例):"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security --user-data-dir="C:\chrome-file-dev"。
2、另存为 chrome-file-dev.bat,右键以管理员身份运行。
3、在新开窗口中拖入本地 HTML 文件,此时 showOpenFilePicker() 将不再抛出 NotAllowedError。
4、注意:该实例不可用于日常上网,因其禁用了核心安全机制。



















