Ответ на этот вопрос зависит от ваших ответов на следующие вопросы:
- Вас устраивает тот факт, что поддержка записи файлов в настоящее время существует только в браузерах на основе Chromium (Chrome & Opera)?
- У вас все в порядке с использованием проприетарного API, чтобы воспользоваться такой возможностью?
- У вас есть возможность удаления этого API в будущем?
- У вас все в порядке с сжатием файлов, созданных с помощью указанного API, на песочницу (место, за пределами которого файлы не могут оказать никакого влияния) на диске?
- хорошо с использованием виртуальной файловой системы (структура каталогов, которая не обязательно существует на диске в той же форме, что и при обращении из браузера) для представления таких файлов?
Если вы ответили «да» на все вышеперечисленное, то с помощью API File , FileWriter и FileSystem вы можете читать и записыватьФайлы из контекста вкладки / окна браузера с использованием Javascript.
Вот простые примеры того, как API, прямо или косвенно, используются для выполнения этих действий:
BakedGoods *
Запись файла:
//"SGVsbG8gd29ybGQh" is "Hello world!" encoded in Base64; raw binary data can
//also be written with the use of Typed Arrays and the appropriate mime type
bakedGoods.set({
data: [{key: "testFile", value: "SGVsbG8gd29ybGQh", 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){}
});
Использование необработанного файла,FileWriter и API-интерфейсы FileSystem
Запись файла:
function onQuotaRequestSuccess(grantedQuota)
{
function saveFile(directoryEntry)
{
function createFileWriter(fileEntry)
{
function write(fileWriter)
{
//"SGVsbG8gd29ybGQh" is "Hello world!" encoded in Base64;
//raw binary data can also be written with the use of
//Typed Arrays and the appropriate mime type
var dataBlob = new Blob(["SGVsbG8gd29ybGQh"], {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 , доступ к которому предоставляется через Silverlight.
IsolatedStorage во многих отношениях похож на FileSystem, в частности он также существует в песочнице и использует виртуальную файловую систему.Однако для использования этой функции требуется управляемый код ;решение, которое требует написания такого кода, выходит за рамки этого вопроса.
Конечно, решение, которое использует дополнительный управляемый код, оставляя только один для написания Javascript, находится в рамках этого вопроса;):
//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
data: [{key: "testFile", value: "SGVsbG8gd29ybGQh", dataFormat: "text/plain"}],
storageTypes: ["fileSystem", "silverlight"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
* BakedGoods поддерживается только этим парнем:)