Существует способ сделать это, но она опирается на API Chrome только Filesystem. Мы создадим и напишем во временный файл в изолированной файловой системе и скопируем его в обычную файловую систему, как только мы закончим. Таким образом, вам не нужно хранить весь файл в памяти.Асинхронная версия API Chrome в настоящее время не рассматривается для стандартизации W3C, но синхронная версия (которая использует веб-работников). Если поддержка браузера вызывает беспокойство, то этот ответ не для вас.
API работает следующим образом: Сначала мы получаем функцию requestFileSystem()
из браузера. В настоящее время он приставка «WebKit»:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
Далее мы спрашиваем временный файл система (этот путь нам не нужно спрашивать разрешения пользователя):
var fileSystem; //This will store the fileSystem for later access
var fileSize = 1024*1024 //Our maximum file system size.
function errorHandler(e) {
console.log('Error: ' + e.name);
}
window.requestFileSystem(window.TEMPORARY, fileSize, function (fs) { fileSystem = fs; }, errorHandler);
Теперь, когда мы имеем доступ к файловой системе настало время для создания файла:
var fileOptions = {
create: true, //If the file is not found, create it
exclusive: false //Don't throw an error if the file doesn't exist
};
Здесь мы называем функцию getFile()
, которая может создать файл, если он не существует. Внутри обратного вызова мы можем создать новый файл fileWriter
для записи в файл. Затем fileWriter
перемещается в конец файла, и мы создаем новый блок текста для добавления к нему.
fileSystem.root.getFile(fileName, fileOptions, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
var blob = new Blob([STRING_TO_WRITE], {type: 'text/plain'});
fileWriter.write(blob);
}, errorHandler);
});
Обратите внимание, что этот API не сохраняется в нормальной пользовательской файловой системе. Вместо этого он сохраняет специальную папку с песочницей. Если вы хотите сохранить его в файловой системе пользователя, вы можете создать ссылку filesystem:
. Когда пользователь нажмет на него, он предложит им сохранить его. После их сохранения вы можете удалить временный файл.
Эта функция генерирует ссылку filesystem
используя toURL()
функцию, fileEntry
«s:
var save = function() {
var download = document.querySelector("a[download]");
if (!fileSystem) { return; }
fileSystem.root.getFile(fileName, {create: false, exclusive: true}, function(fileEntry) {
download.href = fileEntry.toURL();
}, errorHandler);
}
Используя ссылку с атрибутом загрузки заставит загрузку файла.
<a download></a>
Вот plunker, который демонстрирует это: http://plnkr.co/edit/q6ihXWEXSOtutbEy1b5G?p=preview
Надеемся, что это выполняет то, что вы хотите. Вы можете непрерывно добавлять к файлу, он не будет храниться в памяти, но он будет находиться в изолированной файловой системе, пока пользователь не сохранит ее в обычной файловой системе.
Для получения дополнительной информации ознакомьтесь с этим HTML5rocks article или this one, если вы хотите использовать новый, синхронный API Web Worker.
Если вы не можете найти решение этого вопроса, это может быть альтернативой, чтобы поместить данные в [Blob] (https://developer.mozilla.org/ en-US/docs/Web/API/Blob), а затем используйте [createObjectURL()] (https://developer.mozilla.org/de/docs/Web/API/URL.createObjectURL), чтобы создать ссылку для загрузки , Браузеры, скорее всего, будут кэшировать данные на диске, и особенно у вас не будет большого URL-адреса данных. – Phillip
@Phillip Я не хочу хранить весь контент в блоке или zip-файле или использовать indexDb, это требование является потоковым. – DhruvPathak
нет. все современные технологии браузера требуют знания общего размера перед отправкой первых байтов; только более новые серверные элементы, такие как node.js, могут использовать http1.1 chunking. вам придется использовать много соединений или буфер. вы можете использовать веб-узлы, но для этого потребуется немного настройки на обоих концах. – dandavis