我正在尝试使用Apache cordova文件插件在本地保存文件,我收到安全错误
我的代码在
下面 window.resolveLocalFileSystemURL(cordova.file.dataDirectory, function(dir) {
console.log("got main dir", dir.name);
dir.getFile("catalog.json", {create:true}, function(file) {
console.log("got the file", file);
logOb = file;
});
}, function(error) {
console.log(error.message);
console.log(error.name);
});
控制台出错:
It was determined that certain files are unsafe for access within a Web application, or that too many calls are being made on file resources.
SecurityError
我是否需要添加allow-intent标记以启用文件?
我认为我显然遗漏了一些东西,但我尝试在没有具体结果的情况下在互联网上搜索。
答案 0 :(得分:1)
Cordova移动网络浏览默认启用了本地文件访问(但始终由应用程序配置决定)。常规浏览器启用了许多安全功能:其中一个是从其他文件(例如js代码)访问本地文件块。
常见的错误来源是Chrome缺少--allow-file-access-from-files
启动参数。有关详细信息,请参阅How to launch html using Chrome at "--allow-file-access-from-files" mode?。
请务必同时查看Cordova文件插件browser quirks。
您的代码的另一个问题是使用cordova.file.dataDirectory
快捷方式,根据the documentation,浏览器不支持该快捷方式:
cordova.file.dataDirectory - 持久和私有数据存储 使用内部存储器(iOS,Android,BlackBerry 10,windows)在应用程序的沙箱中
如果查看cordova.file.*Directory
列表,可以看到浏览器平台不支持任何cordova快捷方式。
根据您使用的浏览器,应在浏览器中使用cdvfile://localhost/persistent/file
或file:///persistent/path/to/entry
之类的路径。您可以在文档的browser quirks部分找到有关此内容的更多信息。
答案 1 :(得分:0)
尝试在本地保存文件时遇到同样的错误
cordova build browser
适用于 Chrome 和 Edge,但不适用于 Firefox。
感谢之前的评论,我确实理解 cordova.file.dataDirectory
不支持 platform browser
。经过一番挖掘,我发现了 that in Chrome you need to use the webkit functions to access local files。
window.webkitRequestFileSystem(window.PERSISTENT|window.TEMPORARY , [filesize], [ReadWriteFunction]);
但是对于所有其他平台(包括 Firefox),我们可以使用 cordova.file.dataDirectory
。为了让代码适用于所有情况(android、ios、浏览器(使用 Chrome 和 Firefox)),我们需要使用 window.resolveLocalFileSystemURL
或在必要时使用 window.webkitRequestFileSystem
。有了这些信息,问题的代码就可以更改为。
// Function when Folder is loaded
successFunction = function(dir){
console.log("got main dir", dir.name);
dir.getFile("catalog.json", {create:true}, function(file) {
console.log("got the file", file);
logOb = file;
});
};
// Function for error
errorFunction = function(error){
console.log(error.message);
console.log(error.name);
}
if(cordova.platformId === 'browser'){
if(typeof window.webkitRequestFileSystem !== 'undefined'){
window.webkitRequestFileSystem(
window.PERSISTENT , // Where to look for
1024*1024, // request max available size ( here 1 MB),
function(dir){ successFunction.apply(this, [dir]); };
function(error){ errorFunction.apply(this, [error]); };
});
}
}
window.resolveLocalFileSystemURL(
cordova.file.dataDirectory,
function(dir){ successFunction.apply(this, [dir]); };
function(error){ errorFunction.apply(this, [error]); };
});
我没有检查问题的代码是否像这样运行。