如何使用文件插件在Apache Cordova中本地保存文件

时间:2016-06-18 00:52:48

标签: cordova

我正在尝试使用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标记以启用文件?

我认为我显然遗漏了一些东西,但我尝试在没有具体结果的情况下在互联网上搜索。

2 个答案:

答案 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/filefile:///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]); };
 });

我没有检查问题的代码是否像这样运行。