2017-06-30 1 views
2

Ich muss tar ein Verzeichnis, und senden Sie diese an einen Remote-Endpunkt über HTTP PUT.nodejs/fs: Schreiben eines Tar in den Speicherpuffer

Ich könnte natürlich das Tar erstellen, speichern Sie es auf der Festplatte, dann lesen Sie es erneut und senden Sie es.

Aber ich würde lieber den tar erstellen, dann pipe es in einen Puffer und senden Sie es sofort. Das habe ich nicht geschafft.

-Code bisher:

var tar = require('tar'); 
var fs = require("fs"); 

var path = "/home/me/uploaddir"; 

function getTar(path, cb) { 
    var buf = new Buffer(''); 
    var wbuf = fs.createWriteStream(buf); 
    wbuf.on("finish", function() { 
    cb(buf); 
    }); 
    tar.c({file:""},[path]). 
    pipe(wbuf); 
} 

getTar(path, function(tar) { 
    //send the tar over http 
}); 

Dieser Code führt:

fs.js:575 
    binding.open(pathModule._makeLong(path), 
     ^

TypeError: path must be a string 
    at TypeError (native) 
    at Object.fs.open (fs.js:575:11) 

ich auch ein Array als Puffer versucht haben, verwenden, keine Freude.

+0

uh? Es scheint, als ob Sie einen Puffer mit der Länge 0 an 'fs.createWriteStream' übergeben, was schließlich zu einem Fehler –

+0

führen wird. Ich bin mir dessen bewusst, aber ich erstelle zuerst einen tar eines Verzeichnisses, von dem ich nichts weiß die Größe, wie sollte der Puffer zugewiesen werden? – faboolous

Antwort

1

Die folgende Lösung

schafft den Teer, dann Rohre es bis zu einem gewissen Puffer und sendet sie sofort

und mit great speed dank der tar-fs-Bibliothek:

Zuerst installieren die Bibliotheken request für vereinfachte Anfragen und tar-fs, die Dateisystembindungen für den Teerstrom bereitstellt: npm i -S tar-fs request

var tar = require('tar-fs') 
var request = require('request') 
var fs = require('fs') 

// pack specific files in the directory 
function packTar (folderName, pathsArr) { 
    return tar.pack(folderName, { 
    entries: pathsArr 
    }) 
} 

// return put stream 
function makePutReq (url) { 
    return request.put(url) 
} 

packTar('./testFolder', ['test.txt', 'test1.txt']) 
    .pipe(makePutReq('https://www.example.com/put')) 

Ich habe die Funktionsnamen umbenannt, um super ausführlich zu sein.

+0

Das sieht gut aus, ich habe Probleme im letzten Schritt, aber es könnte unser PUT Endpunkt sein, also arbeite ich noch daran. Danke für jetzt – faboolous

+0

Versuchen Sie mit https://requestb.in/ wie diese '.pipe (makePutReq ('https://requestb.in/ '))' zu testen, ob es der Code oder der Endpunkt – Tom

+0

ich bekomme eine 400 Bad Request mit unserem Endpunkt und 404 Not Found mit 'https: // requestb.in/mylittletest''. Ich mache tatsächlich: 'tar.pack (Pfad) .pipe (request.put ('https://requestb.in/mylittletest') .on (" Antwort ", Funktion (res) {....})' um zu wissen, ob die Anfrage erfolgreich ist – faboolous

Verwandte Themen