0

我正在尝试使用 FileSystem API 使用 FileSystem API 将 SPA 上上传的文件写入本地沙盒文件系统。

文件是用 drop acion 上传的,我可以在回调中获取File对象数组。从File我可以得到ReadableStream调用stream方法(是的,它只返回可读的流)。

考虑到上传的文件可能足够大,我会选择流而不是完全加载到 blob 中,然后写入 FileSystem api。

因此,按照文档的步骤是:

  1. 通过异步调用获取FileSystem(DOMFileSystem) 。webkitRequestFileSystem
  2. root获取作为 FileSystemDirectoryEntry的道具
  3. 通过getFile(带有标志create:true)创建一个返回(异步)a的文件FileSystemFileEntry

现在从 FileEntry 我可以得到一个 FileWriter 使用createWriter,但它已经过时(在 MDN 中),并且无论如何它是一个 FileWriter 而我希望获得一个WritableStream而不是为了使用pipeTo上传的文件 Handler->ReadableStream。

所以,我看到在控制台FileSystemFileHandler中定义了类(接口),但我不明白如何从FileSystemFileEntry. 如果我能获得一个,FileSystemFileHandler我可以调用createWritable来获得一个FileSystemWritableFileStream我可以用 ReadStream 进行“管道”的操作。

谁能澄清这个烂摊子?

参考: https://web.dev/file-system-access/ https://wig.github.io/file-system-access/#filesystemhandle https://developer.mozilla.org/en-US/docs/ Web/API/文件系统文件条目

4

1 回答 1

1

您在底部的“参考”链接中有解决方案。具体来说,这是要阅读的部分。您可以像这样创建文件或目录:

// In an existing directory, create a new directory named "My Documents".
const newDirectoryHandle = await existingDirectoryHandle.getDirectoryHandle('My Documents', {
  create: true,
});
// In this new directory, create a file named "My Notes.txt".
const newFileHandle = await newDirectoryHandle.getFileHandle('My Notes.txt', { create: true });

一旦你有了一个文件句柄,你就可以通过管道传递给它或写入它:

async function writeFile(fileHandle, contents) {
  // Create a FileSystemWritableFileStream to write to.
  const writable = await fileHandle.createWritable();
  // Write the contents of the file to the stream.
  await writable.write(contents);
  // Close the file and write the contents to disk.
  await writable.close();
}

……或者……</p>

async function writeURLToFile(fileHandle, url) {
  // Create a FileSystemWritableFileStream to write to.
  const writable = await fileHandle.createWritable();
  // Make an HTTP request for the contents.
  const response = await fetch(url);
  // Stream the response into the file.
  await response.body.pipeTo(writable);
  // pipeTo() closes the destination pipe by default, no need to close it.
}
于 2020-12-16T15:23:26.983 回答