Подтвердить что ты не робот

Могу ли я писать файлы с помощью HTML5/JS?

Интересно, можно ли каким-либо образом писать файлы из HTML5/JS? В broswer...

4b9b3361

Ответ 2

Предполагая, что ваша конечная цель - позволить пользователю сохранить файл где-нибудь там, где они его найдут, например, при щелчке правой кнопкой мыши по ссылке и выборе "Сохранить как...", пока нет широкого охвата браузером для этих API, вероятно, из-за соображений безопасности.

Что вы можете сделать, однако, API-интерфейсы или нет, - это дрессировка его ссылкой на data: uri с download с указанием вашего предложенного имени файла. Например:

<a id="save" download="earth.txt" href="data:text/plain,mostly harmless&#10;">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 || '');
}

Ответ 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 поддерживается не кем иным, как этим парнем прямо здесь:)