Может ли JavaScript получить доступ к файловой системе?
Я был почти уверен, что ответ НЕТ, и, следовательно, Google Gears, Adobe AIR и т. Д.
Если я был прав, то как работает http://tiddlywiki.com/? Он постоянен и написан на JavaScript. Это также просто один HTML-файл, который не имеет внешних (серверных) зависимостей. WTF? Где / как хранится его состояние?
6 ответов
Tiddlywiki имеет несколько методов сохранения данных, в зависимости от того, какой браузер используется. Как вы могли видеть в источнике.
- Если ActiveX включен, он использует Scripting.FileSystemObject.
- В браузерах на основе Gecko он пытается использовать UniversalXPConnect.
- Если Java включена, она использует Java-апплет TiddlySaver.
- Если Java LiveConnect включен, он пытается использовать классы файлов Java.
API HTML5 File [ 1], FileWriter [ 2] и FileSystem [ 3] доступны в последнем канале разработчиков Google Chrome. API-интерфейс FileSystem позволяет выполнять чтение / запись в файловую систему "песочницы" в пространстве, известном браузеру. Вы не можете, например, открыть папку "Мои рисунки" в локальной FS пользователя и прочитать / записать в нее. Это что-то в работе, но это не будет готово некоторое время. Пример написания файла:
window.requestFileSystem(
TEMPORARY, // persistent vs. temporary storage
1024 * 1024, // 1MB. Size (bytes) of needed space
initFs, // success callback
opt_errorHandler // opt. error callback, denial of access
);
function initFs(fs) {
fs.root.getFile('logFile.txt', {create: true}, function(fileEntry) {
fileEntry.createWriter(function(writer) { // FileWriter
writer.onwrite = function(e) {
console.log('Write completed.');
};
writer.onerror = function(e) {
console.log('Write failed: ' + e.toString());
};
var bb = new BlobBuilder();
bb.append('Lorem ipsum');
writer.write(bb.getBlob('text/plain'));
}, errorHandler);
}
}
Проверьте эту колоду слайдов хранения HTML5 для большего количества фрагментов кода.
Он использует ссылки на Java-файлы, как это:
drivers.tiddlySaver = {
name: "tiddlySaver",
deferredInit: function() {
if(!document.applets["TiddlySaver"] && !$.browser.mozilla && !$.browser.msie && document.location.toString().substr(0,5) == "file:") {
$(document.body).append("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1'height='1'></applet>");
}
},
isAvailable: function() {
return !!document.applets["TiddlySaver"];
},
loadFile: function(filePath) {
var r;
try {
if(document.applets["TiddlySaver"]) {
r = document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8");
return (r === undefined || r === null) ? null : String(r);
}
} catch(ex) {
}
return null;
},
saveFile: function(filePath,content) {
try {
if(document.applets["TiddlySaver"])
return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content);
} catch(ex) {
}
return null;
}
}
Может ли JavaScript получить доступ к файловой системе?
Насколько я знаю, не за пределами области песочницы, упомянутой выше. Однако он может получить доступ к подписанному Java-апплету, который имеет вызываемые открытые методы, которые могут получить доступ ко всем файлам. Я сделал это, и он отлично работает и кросс-браузер.
Часть для подписи несколько сложна, и для профессионального использования вам может понадобиться заплатить за сертификат для подписи кода, удостоверяющий вашу личность. Получить его из какого-то места, как Verisign. Таким образом, пользователи, по крайней мере, знают, кому написан апплет (если это помогает). Вы можете подписать его бесплатно, но одно из этих всплывающих окон "возможной угрозы безопасности" будет появляться при первом использовании для авторизации пользователем.
Вы могли бы подумать, что такие подписанные апплеты для записи в файл уже существуют для загрузки, но я не смог найти ни одного через поиск. Если они это сделали, вы можете просто подключить его к своей странице, изучить API и все готово.
Технически вы можете сделать
netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserWrite');
в браузере, совместимом с Netscape (Firefox, Mozilla, Netscape), и он спросит пользователя * разрешить ли доступ к файловой системе, но это не переносимо.
* один раз за процесс браузера
Ответ действительно НЕТ. Java-апплеты и страшные плагины ActiveX обычно используются, если это требуется