2017-09-25 2 views
0

Ich habe ein Array von Strings, die in eine TXT-Datei geschrieben werden sollten. Außerdem muss ich die resultierende .txt-Datei mit JSZip in das .zip-Format komprimieren. Auf der Client-Seite konnte ich ein 'text/plain'-Blob erzeugen, indem ich dieses Array von Strings benutzte, und dann habe ich dieses Blob mit JSZip in das .zip-Format komprimiert. Ich muss das gleiche auf der Serverseite mit node.js tun, aber ich erkannte, dass Blob in node.js nicht verfügbar ist. Ich habe versucht, 'Buffer' anstelle von Blob zu verwenden, und ich habe eine Binärdatei komprimiert als .zip; Ich bin ein Anfänger mit node.js und konnte die Konzepte von Puffer nicht verstehen. Kann ich in node.js einen Blob erstellen? oder Kann ich die gleichen Operationen mit node.js Buffer ausführen?Wie wird eine ZIP-Datei mit Buffer-Inhalten in node.js mithilfe von JSZip generiert?

Auf der Client-Seite ich die Zip-Datei von Blob Inhalte wie diese,

//stringsArray is an array of strings 
var blob = new Blob(stringsArray, { type: "text/plain" }); 

var zip = new JSZip(); 
zip.file('file.txt' , blob); 

zip.generateAsync({ type: 'blob', compression: 'DEFLATE' }) 
.then(function(zipFile){ 

    //do something with zipFile 

}, function(error){ 

    console.log('Error in compression'); 

}); 

Wie kann ich das gleiche tun mit Node.js erzeugen kann?

+1

Dieser Code sollte so laufen wie es ist. Überprüfen Sie vielleicht die Dokumentation für JSZip, wenn sie eine andere Methode für Knoten haben. –

+0

@BrahmaDev, ich habe 'Blob ist nicht definiert' Fehler in node.js – HariV

+1

Entschuldigung dafür, müssten Sie Puffer verwenden. Die Dokumentation wäre ein guter Punkt, um dies zu erforschen: https://stuk.github.io/jszip/documentation/api_jszip/generate_async.html –

Antwort

0

Ich habe eine Lösung dafür gefunden. In meinem Code verwendete ich nicht die richtige Methode, um das Array von Zeichenfolgen in node.js Puffer zu konvertieren (ich konnte den Puffer nicht mit JSZip komprimieren, weil der Puffer falsch war). Ich habe versucht, den folgenden Code, aber es gab mir einen falschen Puffer,

//stringsArray is an array of strings 
var buffer = Buffer.from(stringsArray); 

Der richtige Weg ist, dass müssen wir jede Zeichenfolge konvertieren zuerst zu puffern und dann einen neuen Puffer erstellen, indem Sie alle diese Unter Puffer angehängt wird. Ich habe einen benutzerdefinierten Puffer-Generator erstellt, der einen node.js-Puffer erstellt, indem er Zeichenfolgen an ihn anfügt. Im Folgenden ist die neue Methode, die ich versucht habe, und es hat für mich funktioniert.

var CustomBufferBuilder = function() { 

    this.parts = []; 
    this.totalLength = 0; 

} 

CustomBufferBuilder.prototype.append = function(part) { 

    var tempBuffer = Buffer.from(part); 
    this.parts.push(tempBuffer); 
    this.totalLength += tempBuffer.length; 
    this.buffer = undefined; 

}; 

CustomBufferBuilder.prototype.getBuffer = function() { 

    if (!this.buffer) { 

     this.buffer = Buffer.concat(this.parts, this.totalLength); 

    } 
    return this.buffer; 

}; 


var customBufferBuilder = new CustomBufferBuilder(); 
var stringsArray = [ 'hello ', 'world.', '\nThis ', 'is', ' a ', 'test.' ];//stringsArray is an array of strings 
var len = stringsArray.length; 
for(var i = 0; i< len; i++){ 

    customBufferBuilder.append(stringsArray[ i ]); 

} 

var bufferContent = customBufferBuilder.getBuffer(); 

var zip = new JSZip(); 
zip.file('test.txt', bufferContent, { binary : true }); 
zip.generateAsync({ type : "nodebuffer", compression: 'DEFLATE' }) 
.then(function callback(buffer) { 

    fs.writeFile('test.zip', buffer, function(err){ 

     if(err){ 

      //tasks to perform in case of error 

     } 
     else{ 

      //other logic 

     } 

    }); 

}, function(e) { 

    //tasks to perform in case of error 

}); 

Als Ausgabe habe ich die Zip-Datei (test.zip) und test.txt drin. Die Datei test.txt in der Zip-Datei enthält die folgenden Wörter: 'Hallo Welt. \ NDies ist ein Test.'.

Danke @BrahmaDev für die Zeit zu verbringen, um in meine Frage zu sehen :)

Verwandte Themen