2017-06-30 10 views
2

tarにディレクトリを設定し、これをHTTP PUT経由でリモートエンドポイントに送信する必要があります。nodejs/fs:タールをメモリバッファに書き込む

もちろん、タールを作成してディスクに保存してから、もう一度それを読んで送信することができます。

しかし、私はむしろタールを作成してから、それをいくつかのバッファにパイプしてすぐに送信したいと思います。私はこれを達成することができませんでした。これまで

コード:中

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 
}); 

このコードの結果:私はまた、バッファ、無喜びとして配列を使用してみました

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) 

+0

uh?長さ0のバッファを 'fs.createWriteStream'に渡しているようですが、最終的にはエラー –

+0

になります。私はこれを認識していますが、最初に私が知らないディレクトリのタールを作成しているのでサイズ、バッファをどのように割り当てる必要がありますか? – faboolous

答えて

1

次のソリューション

は、いくつかのバッファへのパイプを、その後、タールを作成し、

とタール-FSライブラリにgreat speedおかげですぐにそれを送信します。

まずインストール簡略化された要求の場合はrequestライブラリ、tar-streamのファイルシステムバインディングを提供する場合はtar-fsnpm 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')) 

私は関数名の名前を超冗長に変更しました。

+0

これは良い人に見えますが、私は最後のステップで問題を抱えていますが、それは私たちのPUTエンドポイントである可能性があります。ありがとうございました – faboolous

+0

この '.pipe(makePutReq( 'https://requestb.in/ '))'のようにhttps://requestb.in/を使ってみてください。コードまたはエンドポイント – Tom

+0

私たちのエンドポイントでは400の悪い要求があり、404には「https:// requestb.in/mylittletest」が見つかりませんでした。私は実際にやっている: 'tar.pack(path).pipe(request.put( 'https://requestb.in/mylittletest').on(" response "、function(res){....})' – faboolous

関連する問題