Почему эта файловая система 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);

3 ответа

Решение

Не уверен, что это лучший ответ, но, похоже, это ограничение безопасности для локальных файлов. Запуск Chrome, как показано ниже, устраняет проблему:

google-chrome --allow-file-access-from-files

Это позволит создать постоянное хранилище.

Если ваше приложение требует, чтобы пользователь дважды щелкнул HTML-файл, тогда ваш ответ может быть единственным путем. Однако, если вам нужен доступ к локальному файлу, но у вас есть некоторая гибкость с точки зрения доступа к этому локальному файлу, подумайте о создании небольшого локального сервера.

В Windows установите http-сервер (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.

manifest.json

"web_accessible_resources": ["file/*"]

Внедрить скрипт в виде HTML.

доступ к расширению chrome://link_extensions/file/htm_form.html и успешный доступ в FileSystem

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