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, сериализация, похоже, теряет разрешение