你知道 js 可以在浏览器中读写本地文件(包括目录)吗?

2023-03-17 09:16:32 +08:00
 LonnyWong

我在实现 https://github.com/trzsz/trzsz.js ( 在浏览器中类似 rz / sz 那样上传和下载文件 )时,发现了 Chrome 等浏览器支持 js 读写本地文件,详见 https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API

一开始实现的 trzsz ( trz / tsz ) 只支持上传和下载文件,不支持目录,所以没太关注目录方面的描述。等到后来 trzsz ( trz / tsz ) 开始支持上传和下载目录,想当然认为 js 能在浏览器中读写文件已经很好了,没想着 js 是否也可以在浏览器中读写目录。

直到有人问起 trzsz ( trz / tsz ) 在浏览器中是不支持目录传输吗,又再去看了一次 API 文档,才发现目录相关的 API 被我忽略了。js 有读写目录的权限,https://github.com/trzsz/trzsz.js 就可以和其他终端一样,上传和下载目录了,下载多个文件时也不用多次弹出对话框了。Cool…

2981 次点击
所在节点    程序员
11 条回复
weijancc
2023-03-17 09:28:44 +08:00
vscode web 版本可以直接打开本地文件夹, 就是用这个 api
gogogo2000
2023-03-17 09:28:54 +08:00
当用户选择一个文件 /文件夹后,js 本来就是可以随便读取的。读取文件夹不是 w3c 标准的,但是目前主流浏览器都支持。

想要不经过用户同意就读取任意文件夹那肯定是不可能的
gogogo2000
2023-03-17 09:29:49 +08:00
@weijancc vscode 的后端是 nodejs 的,nodejs 不属于浏览器,不受浏览器限制,通过 fs 系列 API 可以任意读取任何文件。
weijancc
2023-03-17 09:31:16 +08:00
@gogogo2000 你说的是 code-server, 有个纯 web 版本的
sombruh
2023-03-17 09:38:12 +08:00
LonnyWong
2023-03-17 09:38:50 +08:00
@gogogo2000
js 刚出世时,是可以直接读写所有文件的,这导致了很严重的安全问题。后来禁止 js 读写任何文件,又导致很多功能实现不了。取得用户授权后,允许在指定范围内读写文件,这是一个很好的权衡。
xu45525584
2023-03-17 09:46:31 +08:00
。浏览器 兼容性没跟上,用的话 基本只能指定 chrome
LonnyWong
2023-03-17 10:06:56 +08:00
@xu45525584 用的时候不用判断浏览器,直接判断 API 是否存在就好。当 API 不存在时,做好降级处理。等其他浏览器以后支持了,也不用再修改什么。
gogogo2000
2023-03-17 10:26:12 +08:00
@LonnyWong 知道的,ie 时代的 js 就是群魔乱舞,还有一大堆 js 病毒。

退一步说即便 js 不行,ie 时代还有 activex ,还有 flash ,能随意读取文件的方法很多……
oldshensheep
2023-03-17 10:43:10 +08:00
最新版的 Firefox 也支持了
xiaojie668329
2023-03-17 13:37:01 +08:00
用过。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/924721

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX