6

我正在编写一个 HTML5 应用程序以在 Chrome 中运行,但它将位于本地文件系统上(因此他们将通过双击 html 文件来启动它)。当我尝试访问文件系统时它会抛出一个错误,我认为这是因为它是一个本地文件。有没有办法让 Chrome 允许这样做?

(注意:我确实收到弹出窗口,要求我允许应用程序永久存储,然后单击“确定”。它仍然会引发此错误)

下面的代码抛出错误:

DOMException {message: "NotSupportedError: DOM Exception 9", name: "NotSupportedError", code: 9, INDEX_SIZE_ERR: 1, DOMSTRING_SIZE_ERR: 2…}

文件测试.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);
4

2 回答 2

12

不确定这是最好的答案,但它似乎是对本地文件的安全限制。按以下方式启动 Chrome 可解决此问题:

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

这将允许创建持久存储。

于 2013-05-10T17:53:35.527 回答
4

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

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

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

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

于 2016-03-07T06:39:23.060 回答