我想将无限数量的文件保存到用户硬盘,而不是让用户点击对话框。
我在使用无限存储时看到的唯一文档是: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.requestFileSystem
(type
或"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上的文档并不是很好,所以我想我要问看看是否有人知道以前的经验。兔子洞越少越好。
答案 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>