使用 javascript 读取文件 - File System Access API

4,089 阅读2分钟

这是我参与更文挑战的第 19 天,活动详情查看:更文挑战


能够选择用户本地设备上的文件并与之交互是 Web 最常用的功能之一。在这之前,只能将文件整体上传之后才能进行操作。直到 File System Access API 出现,有了新的转机。

什么是 File System Access API

File System Access API 允许用户选择文件并将其上传到服务器,例如上传照片。但是,它还允许网站阅读和操作它们,而无需将数据传输到整个网络。

请注意:在搜索时可能会发现一个叫 File System API 的东西,这个现在已经不推荐使用。新的提案可以在 WICG 看到,更新时间在 2021.6.4。

提案详细内容,请看 File System Access API

它能做到什么?

  • 应用可与用户本地设备上的文件进行交互
  • 直接读写文件、创建文件夹,但不需要将文件整个上传
  • 可打开目录并列举内容

浏览器支持程度

  • Google 浏览器支持,基于 Chromium 内核的浏览器均支持。
  • 不支持的浏览器,可以使用 Browser-FS-Access 做 polyfill

示例

有一个 文本编辑器 的示例,源码在 Github 。通过这个示例,可以大体了解 File System Access API 的使用方法。

如何进行

事前准备

首先,File System Access API 只允许在安全环境下调用。配置安全环境请参考翻译文章 如何在你的本地开发环境中使用 HTTPS。部分 API 调用时需要用户手动触发。

打开一个文件

调用 window.showOpenFilePicker() 方法,可以打开文件选择对话框选择单个文件,类似下图这种:

image.png

window.showOpenFilePicker 方法支持传入可选参数 option,这些参数可以影响文件选择对话框的行为,比如指定文件类型、可多选文件之类的。

这个方法调用需要用户手动触发

let fileHandle;
butOpenFile.addEventListener('click', async () => {
  // Destructure the one-element array.
  [fileHandle] = await window.showOpenFilePicker();
  // Do something with the file handle.
});

选择文件之后,API 会返回一组文件操作 handle,其中包含与文件交互所需的属性和方法,例如读写文件。

从文件系统中读取文件

上一步你获取了文件操作 handle,可以借此获取文件属性,或访问文件本身。

现在,我只需要读取文件内容。调用 getFile 方法可获得文件对象,其中包含一个 blob。要读取 blob 数据,可以使用下列方法之一:stream()text()arrayBuffer()slice()

const file = await fileHandle.getFile();
const contents = await file.text();