此问题的答案取决于您对以下问题的回答:
- 您是否同意目前仅在基于 Chromium 的浏览器(Chrome 和 Opera)中支持写入文件?
- 您是否愿意使用目前专有的 API 来利用这种功能?
- 您是否同意将来删除上述 API?
- 您是否同意将使用上述 API 创建的文件限制到磁盘上的 沙盒(文件在该位置之外不会产生任何影响)?
- 您是否可以使用虚拟文件系统(磁盘上的目录结构不一定以与从浏览器中访问时相同的形式存在)来表示此类文件?
如果您对以上所有问题都回答“是”,那么使用 File、FileWriter 和 FileSystem API,您可以使用 Javascript 从浏览器选项卡/窗口的上下文中写入文件。
你问的怎么样?
BakedGoods*
写入文件:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
读取文件:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
使用原始 File、FileWriter 和 FileSystem API
写入文件:
function onQuotaRequestSuccess(grantedQuota)
{
function saveFile(directoryEntry)
{
function createFileWriter(fileEntry)
{
function write(fileWriter)
{
var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
fileWriter.write(dataBlob);
}
fileEntry.createWriter(write);
}
directoryEntry.getFile(
"testFile",
{create: true, exclusive: true},
createFileWriter
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
读取文件:
function onQuotaRequestSuccess(grantedQuota)
{
function getfile(directoryEntry)
{
function readFile(fileEntry)
{
function read(file)
{
var fileReader = new FileReader();
fileReader.onload = function(){var fileData = fileReader.result};
fileReader.readAsText(file);
}
fileEntry.file(read);
}
directoryEntry.getFile(
"testFile",
{create: false},
readFile
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
但是如果你在一开始对任何问题的回答都是“否”呢?
如果您对非本地解决方案持开放态度,Silverlight 还允许通过IsolatedStorage 进行来自选项卡/窗口竞赛的文件 i/o。但是,使用此功能需要managed code;需要编写此类代码的解决方案超出了此问题的范围。
当然,一个使用补充托管代码的解决方案,只留下一个 Javascript 来编写,完全在这个问题的范围内;):
//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem", "silverlight"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
*BakedGoods 由这里的这个人维护 :)