Интересно, можно ли каким-либо образом писать файлы из HTML5/JS? В broswer...
Могу ли я писать файлы с помощью HTML5/JS?
Ответ 1
Да, используя новый API FileWriter.
http://www.w3.org/TR/file-writer-api/
Вы можете увидеть текущую поддержку браузера здесь: http://caniuse.com/#feat=filesystem
Ответ 2
Предполагая, что ваша конечная цель - позволить пользователю сохранить файл где-нибудь там, где они его найдут, например, при щелчке правой кнопкой мыши по ссылке и выборе "Сохранить как...", пока нет широкого охвата браузером для этих API, вероятно, из-за соображений безопасности.
Что вы можете сделать, однако, API-интерфейсы или нет, - это дрессировка его ссылкой на data:
uri с download
с указанием вашего предложенного имени файла. Например:
<a id="save" download="earth.txt" href="data:text/plain,mostly harmless ">Save</a>
При щелчке по крайней мере в Chrome это сохранит файл mostly harmless
(и конечную новую строку) как earth.txt
в каталоге загрузки. Чтобы установить содержимое файла из javascript, сначала вызовите эту функцию:
function setSaveFile(contents, file_name, mime_type) {
var a = document.getElementById('save');
mime_type = mime_type || 'application/octet-stream'; // text/html, image/png, et c
if (file_name) a.setAttribute('download', file_name);
a.href = 'data:'+ mime_type +';base64,'+ btoa(contents || '');
}
Ответ 3
Да, можно читать и записывать файлы с помощью HTML5 + JS.
Ссылка, чтобы вы начали - Изучение API файловой системы
Я также написал статью некоторое время назад для SpeckyBoy по той же теме, которую вы можете найти полезной - http://speckyboy.com/2012/10/30/getting-to-grips-with-the-html5-file-api-2/
Ответ 4
Другая возможность - рассмотреть возможность создания чего-то вроде приложения ClickOnce на платформе Windows. Это предоставит ссылку на загружаемый исполняемый файл, который будет запускаться в пользовательской ОС, но может сделать обратные вызовы в Интернете для отправки и получения данных. Приложение ClickOnce может встроить элемент управления браузером и, таким образом, у вас будет как веб-совместимое приложение, способное напрямую общаться с пользовательским хранилищем.
Ответ 5
Насколько я знаю, вы не можете писать файлы из HTML5, потому что предоставление доступа к файлам пользователей веб-страницы будет представлять угрозу безопасности.
Если вам просто нужно сохранить некоторые данные, чтобы ваша страница могла получить к ней доступ позже, в HTML5 есть что-то, называемое Web Storage, которое может это сделать.
Или вы можете хранить данные в файлах cookie (если они очень маленькие) или на сервере.
Ответ 6
Ответ на этот вопрос зависит от ваших ответов на следующие вопросы:
- Вы в порядке с тем, что поддержка такой возможности в настоящее время существует только в браузерах на базе Chrome (Chrome и Opera)?
- Вы в порядке с использованием API-интерфейсов as-of-now, чтобы воспользоваться такой возможностью?
- Вы в порядке с возможностью удаления указанного API в будущем?
- Вы в порядке с сужением файлов, созданных с указанным API, на песочницу (место, за пределами которого файлы не могут повлиять) на диске?
Если вы ответили "да" на все вышеперечисленное, то да, с FileWriter и FileSystem, вы можете записывать файлы из контекста вкладки/окна браузера с помощью Javascript.
Вот простой пример того, как 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);
С BakedGoods *, библиотека Javascript, которая устанавливает единый интерфейс, который может использоваться для проведения общих операций хранения во всех собственных (включая FileSystem), и некоторые не связанные с носителем хранилища, вышеупомянутое выполняется с помощью этого:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", type: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
Спецификация FileSystem не определяет никаких рекомендаций о том, как структуры каталогов должны появляться на диске. Например, в браузерах, основанных на хром, песочница имеет виртуальную файловую систему (структура каталогов, которая не обязательно существует на диске в той же форме, что и при доступе из браузера), в пределах которой каталоги и файлы, созданные с помощью API-интерфейсов.
Таким образом, хотя вы можете писать файлы в систему с API-интерфейсами, поиск файлов без API (ну, без API-интерфейса FileSystem) может быть нетривиальным делом.
* BakedGoods поддерживается не кем иным, как этим парнем прямо здесь:)