我正在编写一个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);
答案 0 :(得分:9)
不确定这是最佳答案,但似乎是对本地文件的安全限制。如下启动Chrome可解决此问题:
google-chrome --allow-file-access-from-files
这将允许创建持久存储。
答案 1 :(得分:1)
如果您的应用要求用户双击html文件,那么您的答案可能是唯一的方法。但是,如果需要访问本地文件,但您在如何访问该本地文件方面具有一定的灵活性,那么请考虑创建一个小型本地服务器。
在Windows上,安装http-server(npm install -g http-server
)并从项目目录运行http-server
。在Mac / Linux上,从本地目录运行python -m SimpleHttpServer
。在浏览器中,访问本地托管的网站。在Windows上,我必须在Mac上使用localhost:8080
我必须使用localhost:8000
。
这个答案的所有功劳归于给予this answer to another SO question的@orszaczky。该答案还讨论了为什么这是一个安全问题,以及为什么使用--allow-file-access-from-files
标志是有潜在危险的。
顺便说一下,这不仅是Chrome(v49.0)的问题,也是Windows和Mac上Opera(v35.0)的问题。