7

尝试使用FileSystemFileHandlegetFile()的方法访问文件时,可能会发生此错误:DOMException: The request is not allowed by the user agent or the platform in the current context.

此代码有效:

async function getTheFile() {
  // open file picker
  [fileHandle] = await window.showOpenFilePicker(pickerOpts);

  // get file contents
  const fileData = await fileHandle.getFile();
}

但是,如果您存储fileHandle(例如使用 IndexedDB)以保持对文件的访问,即使在页面刷新后,它也将不起作用。刷新页面后,该getFile()方法会抛出 DOMException 错误。

这是怎么回事?

4

1 回答 1

8

刷新页面(或关闭应用程序的所有选项卡)时,浏览器不再具有访问文件的权限。

有一个queryPermission()方法可用于FileSystemHandle在尝试读取文件之前确定是否可以访问该文件。

来自有用的 web.dev 文章的示例:

async function verifyPermission(fileHandle, readWrite) {
  const options = {};
  if (readWrite) {
    options.mode = 'readwrite';
  }
  // Check if permission was already granted. If so, return true.
  if ((await fileHandle.queryPermission(options)) === 'granted') {
    return true;
  }
  // Request permission. If the user grants permission, return true.
  if ((await fileHandle.requestPermission(options)) === 'granted') {
    return true;
  }
  // The user didn't grant permission, so return false.
  return false;
}

一旦权限 ===,此函数将返回 true,或者如果权限为或granted,则重新提示用户访问。deniedprompt

于 2021-03-05T23:38:45.117 回答