为啥这个文件系统 api requestQuota 调用失败?

Posted

技术标签:

【中文标题】为啥这个文件系统 api requestQuota 调用失败?【英文标题】:Why does this filesystem api requestQuota call fail?为什么这个文件系统 api requestQuota 调用失败? 【发布时间】:2013-05-05 11:10:03 【问题描述】:

我正在编写一个在 Chrome 中运行的 html5 应用程序,但它将在本地文件系统上(因此他们将通过双击一个 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

这将允许创建持久存储。

【讨论】:

我认为您最好将您的应用程序打包为 Chrome 扩展程序。这为您的应用带来了更多可能性,例如跨域 AJAX 和无限配额。 这就是我要做的。我实际上不需要 AJAX,因为它是 100% 离线的,但无限配额是值得的。 嗨,唐。我遇到了同样的问题,并尝试像这样启动 chrome --allow-file-access-from-files file:///C:/test%20-%203.html 但是,它不起作用。你有什么想法吗?非常感谢。 @AmyWuGo 我不确定。您使用的是什么操作系统?如果您在没有 file:///C:/test%20-%203.html 的情况下启动 chrome 并从 Chrome 中打开它会怎样? @Don 非常感谢。我通过重新启动操作系统来解决这个问题。如果你不介意我还有一个问题。我只想知道你在做什么。并且可以告诉我你最后使用了哪个 API。谢谢。【参考方案2】:

如果您的应用需要用户双击一个 html 文件,那么您的回答可能是唯一可行的方法。但是,如果需要访问本地文件,但您在如何访问该本地文件方面具有一定的灵活性,那么请考虑创建一个小型本地服务器。

在 Windows 上,安装 http-server (npm install -g http-server) 并从您的项目目录运行 http-server。在 Mac/Linux 上,从本地目录运行 python -m SimpleHTTPServer。在浏览器中,访问本地托管的网站。在 Windows 上我必须使用 localhost:8080,而在 Mac 上我必须使用 localhost:8000

这个答案的所有功劳归于@orszaczky,他给了this answer to another SO question。该答案还讨论了为什么这是一个安全问题,以及为什么使用 --allow-file-access-from-files 标志存在潜在危险。

顺便说一下,这不仅是 Chrome (v49.0) 的问题,也是 Windows 和 Mac 上的 Opera (v35.0) 的问题。

【讨论】:

运行简单的服务器确实对我有用,但今天早上的魅力报告很漂亮,有图形和其他东西。然后它今天下午停止工作,现在我已经启动了简单的服务器并且它再次工作,但它是一个超级简单的界面并且不漂亮。有什么想法会发生什么吗? 抱歉,我想我不能帮你解决这个问题。如果您确实找到了自己的解决方案,那么如果您可以将其包含在这些 cmets 中,那就太好了。一切顺利。感谢您在我的回答中对大写拼写错误(SimpleHttpServer 应该是 SimpleHTTPServer)的提醒。确实需要您的编辑/更正。

以上是关于为啥这个文件系统 api requestQuota 调用失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥易语言用windows api没有效果

为啥这个makefile不构建依赖关系,而只是在使用变量时

为啥在 Vue 3 的 Composition API 中使用“API”这个词?

为啥Java中的file类无法只能操作不能读写?

为啥打不开gadget格式的文件?(我的电脑系统是W7)

为啥在 API 级别 30 上使用范围存储无法访问某些音频文件?