C'è un modo per fare questo, ma si basa su un'API Chrome unico filesystem. Creeremo e scriveremo in un file temporaneo in un file system sandboxed e lo coperemo nel file system normale una volta che abbiamo finito. In questo modo non è necessario memorizzare l'intero file in memoria.La versione asincrona dell'API di Chrome non viene attualmente considerata per la standardizzazione da W3C, ma la versione sincrona (che utilizza i web worker) lo è. Se il supporto del browser è un problema, allora questa risposta non fa per te.
L'API funziona in questo modo: Innanzitutto, viene visualizzata la funzione requestFileSystem()
dal browser. Attualmente è preceduto da "WebKit":
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
Avanti, chiediamo un file system temporaneo (in questo modo non abbiamo bisogno di chiedere il permesso dell'utente):
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);
Ora che abbiamo accesso al file system è il momento di creare un file:
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
};
Qui si chiama la funzione getFile()
, che può creare un file se non esiste. All'interno del callback, possiamo creare un nuovo fileWriter
per scrivere sul file. Lo fileWriter
viene quindi spostato alla fine del file e creiamo un nuovo BLOB di testo da aggiungere ad esso.
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);
});
Si noti che questa API non viene salvata nel normale file system dell'utente. Invece, salva in una speciale cartella sandbox. Se si desidera salvarlo nel file system dell'utente, è possibile creare un collegamento filesystem:
. Quando l'utente fa clic su di esso, chiederà loro di salvarlo. Dopo averlo salvato, puoi rimuovere il file temporaneo.
Questa funzione genera il link filesystem
utilizzando la funzione 's il fileEntry
toURL()
:
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);
}
Utilizzando un collegamento con l'attributo scaricare costringerà il download del file.
<a download></a>
Ecco un plunker che illustra questo: http://plnkr.co/edit/q6ihXWEXSOtutbEy1b5G?p=preview
Speriamo che questo compie ciò che si desidera. È possibile aggiungere continuamente al file, non verrà mantenuto in memoria, ma sarà nel file system sandbox fino a quando l'utente non lo salverà sul normale file system.
Per ulteriori informazioni, dare un'occhiata a questo HTML5rocks article o this one se si desidera utilizzare l'API di Worker sincrono più recente.
Se non si trova una soluzione a questo problema, potrebbe essere un'alternativa per mettere i dati in un [Blob] (https://developer.mozilla.org/ en-US/docs/Web/API/Blob) e quindi utilizzare [createObjectURL()] (https://developer.mozilla.org/de/docs/Web/API/URL.createObjectURL) per generare un collegamento per il download . I browser probabilmente memorizzeranno nella cache i dati sul disco e, soprattutto, non disporrai di un URL di dati di grandi dimensioni. – Phillip
@Phillip Non voglio archiviare tutto il contenuto in un file blob o zip, o usare indexDb, lo streaming è il requisito. – DhruvPathak
no. tutte le attuali tecnologie del browser richiedono la conoscenza della dimensione complessiva prima di inviare i primi byte; solo elementi più recenti lato server come node.js possono utilizzare il chunking http1.1. dovrai usare molte connessioni o buffer. potresti essere in grado di utilizzare websockets, ma ciò richiederà un po 'di personalizzazione su entrambe le estremità. – dandavis