chrome应用程序中的无限文件存储

时间:2014-10-04 19:18:29

标签: javascript html5 google-chrome google-chrome-extension google-chrome-app

我想将无限数量的文件保存到用户硬盘,而不是让用户点击对话框。

我在使用无限存储时看到的唯一文档是:https://developers.google.com/chrome/whitepapers/storage,表示它仅适用于Chrome应用。

我见过的Chrome fileSystem API的所有示例都建议,为了创建新文件并向其写入,用户需要从chrome.fileSystem.chooseEntry函数获取一个条目对象,这意味着用户需要通过一个对话框。

常规fileSystem API看起来可以将文件保存到用户的扩展沙箱而不会让用户通过对话框,但我想知道,它是否有{ {1}}仅授予应用的权限?如果只有Chrome API拥有该权限,则不会让我感到震惊。

如果我使用常规的"unlimitedStorage" API,我需要使用fileSystem请求文件系统(我有点惊讶window.webkitRequestFileSystem并非在Chrome中为我工作),但该方法需要window.requestFileSystemtype"persistent")和"temporary"(应用程序将需要存储的字节)参数。

您显然不会在Chrome API中这样做。但是,正常的size API允许您在需要时使用配额管理API请求更多存储空间,这也在我上面链接的页面上进行了记录

https://developers.google.com/chrome/apps/docs/developers_guide#manifest上,它说:

  

fileSystem字段允许您指定应用所需的HTML5权限。通过指定"permissions""unlimitedStorage",此应用程序可以使用这些HTML5功能,而无需反复询问用户是否允许。在安装应用程序期间,将告知用户应用程序需要哪些权限;安装应用程序会隐式授予其URL与清单"notifications"字段中的URL匹配的所有页面的权限。

所以我希望"apps"权限只是意味着我可以致电"unlimitedStorage",而不是要求用户在需要时提高配额,Chrome会自动执行此操作。

问题1:有谁知道它是否有效?

但是,如果只有chrome API具有window.webkitRequestFileSystem(window.PERSISTENT, anySize, successCallback)权限,我可以尝试使用常规API创建文件条目,并将该条目传递到Chrome API函数中,从而省略对话框的需要,并获得"unlimitedStorage"权限的访问权限。

问题2:我是否可以在一个API中创建条目并将其传递给另一个API?我担心不同的API可能有不同的沙箱。

"unlimitedStorage" API上的文档并不是很好,所以我想我要问看看是否有人知道以前的经验。兔子洞越少越好。

2 个答案:

答案 0 :(得分:2)

首先,为避免混淆,此处称为“打包应用”的内容应称为“Chrome应用”。

如果要由任何其他应用程序使用blob,则必须通过FileEntry获取chrome.fileSystem.chooseEntry,以便将数据写入计算机的文件系统,用户可以在该文件系统中访问它。 (您可以从用户那里获取一个目录并保存保留的条目,并在不要求用户每次都做出选择的情况下使用该目录。)

如果该blob仅供该Chrome应用使用,则可以在不调用chrome.fileSystem.chooseEntry的情况下使用该文件API。

至于限制,你是正确的unlimitedStorage允许无限存储。在我的实验中,尽管有文档,我仍然无法获得Chrome应用程序来要求用户授权特定金额。我使用了这个许可,似乎没有限制。我在此阅读的Google文档似乎不准确。

如果您正在写入外部文件系统,则在致电chrome.fileSystem.chooseEntry后,没有任何限制,您也不需要unlimitedStorage权限。

答案 1 :(得分:1)

我的解决方案。

main.js

var chooseDirectory = function() {
  chrome.app.window.create("choose_directory.html");
};

chrome.runtime.onInstalled.addListener(function(details) {
  if (details.reason == 'install') {
    chooseDirectory();
  }
};  

chrome.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) {

  switch (message.type) {
  case 'saveBlob':
    var blob = new Blob([message.blob])

    chrome.storage.local.get('filesystemKey', function(items) {
      var fileSystemRef = items.fileSystemKey;

      chrome.fileSystem.restoreEntry(fileSystemRef, function(fileSystem) {

        fileSystem.getFile('test.txt', { create: true }, function(fileEntry) {

          fileEntry.createWriter(function(writer) {
            writer.write(blob);
          });   
        });             
      });           
    });  
    break;
  } 
});

使用chrome文件系统API后,您可以使用常规的html5文件系统API来创建文件。 正如here所解释的那样,你无法从后台脚本中调用chooseDirectory函数,所以你需要创建一个可以调用它的应用程序窗口,我将在下面进行调用。

choose_directory.js

window.addEventListener('load', function() {

  document.getElementById('input').addEventListener('click', function() {

    chrome.fileSystem.chooseEntry({type: 'openDirectory'}, function(entry) {
      var homeDirectory = chrome.fileSystem.retainEntry(entry);

      chrome.storage.local.set({'filesystemKey': homeDirectory}, function() {
        window.close();
      });           
    });     
  });   
}); 

choose_directory.html

<script src="choose_directory.js"></script>

You need to choose a directory where you will store your files.

<button id="input"> Chose a place to save your files</button>