node-archiver ( https://github.com/archiverjs/node-archiver ) を使用してメモリ上に zip ファイルを作成しています。アーカイバーのパイプ機能を使用して、すべてを Transform ストリームにパイプします。必要に応じて、このストリームをファイルにパイプできますが、リクエスト ( https://github.com/request ) にこのストリームを読み取らせたいので、ファイル システムにアクセスする必要はありません。
以下では、私の変換ストリームは と呼ばれbridge
ます。Transform で特別なことは何もしていません (PassThrough ストリームである可能性もあると思います)。
var archive = archiver('zip');
archive.pipe(bridge);
var r = request.post(url, function(err, res, body){ .... }
var form = r.form();
form.append('token', <some token>);
form.append('file', bridge, { "filename" : "package.zip", "contentType" : "application/zip" });
archive.append(<some string>, { "name": <some file name> });
archive.finalize();
これは機能しません (file
パーツが空のようです)。ただし、ブリッジ変換ストリームをファイル書き込みストリームにパイプすると、ストリームが終了した後、フォーム ファイル操作でそのファイルへの読み取りストリームを作成すると、機能します。もちろん、今では完全に形成されたファイルがあり、request
それを読み取ることができるためです (ここではブリッジは必要ありません。通常のfs
ストリームだけです) 。
bridge.pipe(fs.createWriteStream(<myfile>));
var archive = archiver('zip');
archive.pipe(bridge);
bridge.on("finish", function(){
var r = request.post(url, function(err, res, body){ .... }
var form = r.form();
form.append('token', <some token>);
form.append('file', fs.createReadStream(<myfile>), { "filename" : "package.zip", "contentType" : "application/zip" });
}
archive.append(<some string>, { "name": <some file name> });
archive.finalize();
読み取りストリームがファイルストリームである必要があるかどうかrequest
、そしてここで他に何が間違っている可能性があるのでしょうか。