Почему эта ошибка api requestQuota в файловой системе завершается неудачно?
Я пишу приложение HTML5 для запуска в Chrome, но он будет находиться в локальной файловой системе (чтобы они запустили его, дважды щелкнув файл html). Это ошибка при попытке доступа к файловой системе, и я думаю, что это локальный файл. Есть ли способ сделать Chrome доступным для этого?
(ПРИМЕЧАНИЕ. Я получаю всплывающее окно с просьбой разрешить постоянному хранению приложения, и я нажимаю "ОК". Он по-прежнему вызывает эту ошибку)
Ниже приведен код ошибки:
DOMException {message: "NotSupportedError: DOM Exception 9", name: "NotSupportedError", code: 9, INDEX_SIZE_ERR: 1, DOMSTRING_SIZE_ERR: 2…}
filetest.html
<!DOCTYPE html>
<html>
<head></head>
<body>
<script>
//File System handler
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
function onInitFs(fs) {
console.log('Opened file system: ' + fs.name);
}
function errorHandler(e) {
var msg = '';
switch (e.code) {
case FileError.QUOTA_EXCEEDED_ERR:
msg = 'QUOTA_EXCEEDED_ERR';
break;
case FileError.NOT_FOUND_ERR:
msg = 'NOT_FOUND_ERR';
break;
case FileError.SECURITY_ERR:
msg = 'SECURITY_ERR';
break;
case FileError.INVALID_MODIFICATION_ERR:
msg = 'INVALID_MODIFICATION_ERR';
break;
case FileError.INVALID_STATE_ERR:
msg = 'INVALID_STATE_ERR';
break;
default:
msg = 'Unknown Error';
break;
};
console.log('Error: ' + msg);
}
/** THIS CAUSES IT TO THROW AN ERROR */
window.webkitStorageInfo.requestQuota(window.PERSISTENT, 5*1024*1024, function(grantedBytes) {
window.requestFileSystem(window.PERSISTENT, grantedBytes, onInitFs, errorHandler);
}, function(e) {
console.log('Error', e);
});
</script>
</body>
</html>
Если я вместо этого изменил его, чтобы запросить временное хранилище, он все равно выдает ошибку, но теперь он SECURITY_ERR
:
window.requestFileSystem(window.TEMPORARY, 5*1024*1024, onInitFs, errorHandler);
Ответы
Ответ 1
Не уверен, что это лучший ответ, но, по-видимому, это ограничение безопасности для локальных файлов. Запуск Chrome, как показано ниже, устраняет проблему:
google-chrome --allow-file-access-from-files
Это позволит создать постоянное хранилище.
Ответ 2
Если вашему приложению требуется, чтобы пользователь дважды щелкнул файл html, ваш ответ может быть единственным способом. Однако, если необходимо получить доступ к локальному файлу, но у вас есть определенная гибкость в отношении доступа к этому локальному файлу, тогда подумайте о создании небольшого локального сервера.
В Windows установите http-server (npm install -g http-server
) и запустите http-server
из каталога проекта. В Mac/Linux запустите python -m SimpleHttpServer
из своего локального каталога. В браузере обращайтесь к локально размещенному веб-сайту. В Windows мне пришлось использовать localhost:8080
, а на Mac мне пришлось использовать localhost:8000
.
Весь кредит на этот ответ отправляется @orszaczky, который дал этот ответ на другой вопрос SO. В этом ответе также обсуждается, почему это проблема безопасности, и почему использование флага --allow-file-access-from-files
потенциально опасно.
Кстати, это не только проблема для Chrome (v49.0), но также и для Opera (v35.0), как для Windows, так и для Mac.
Ответ 3
manifest.json
"web_accessible_resources": [ "file/*" ]
введите script в html-форму.
доступ
хром расширение://link_extensions/file/htm_form.html
и доступ к успеху в FileSystem