DOMException: запрос не разрешен пользовательским агентом или платформой в текущем контексте.

При попытке доступа к файлу с помощью метода FileSystemFileHandle может возникнуть эта ошибка: 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.

В чем дело?

2 ответа

Когда страница обновляется (или все вкладки приложения закрываются), браузер теряет разрешение на доступ к файлу.

Существует метод 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;
}

Эта функция вернет истину после разрешения === granted или повторно запрашивать доступ у пользователя, если разрешение либо denied или же prompt.

Обратите внимание, что вам придется предоставлять разрешения каждый раз, когда вы извлекаете дескриптор из indexedDB, сериализация, похоже, теряет разрешение

Другие вопросы по тегам