ファイルを読み取り、圧縮して暗号化し、ネットワークにアップロード/書き込みしています。しかし、投稿リクエストを行うには、最後のストリーム(読み取り、zip、暗号化を通過した後に返されるストリーム)のコンテンツの長さを知る必要があります。
let zlib = zlib.createGzip(),
encrypt = crypto.cipherIV(....),
input = fs.createReadStream('file.jpg');
function zipAndEncrypt(){
let stream = readStream.pipe( zlib).pipe( encrypt );
let options = {
"stream_length":0,
headers: { "content-type": 'image/jpeg',
"content-length": '123456', // need to get this length
.....
}
}
// post the stream
needle( 'post', url, stream, options )
.then( resp => { console.log( "file length", resp.body.length);})
.catch( err => {})
}
上記のコードは、ヘッダーに正しいコンテンツの長さを入力すると機能します (この場合、長さはわかっていました)。したがって、ストリームの長さを見つける必要があります。
これまでのところ、次の方法で長さを達成しました:
let chunk = [], conLength;
stream.on( 'data', ( data ) => {
chunk.push( data );
} )
.on( 'end', () => {
conLength = Buffer.concat( chunk ).length;
} );
しかし、POST リクエストは失敗し、SOCKET ハングアップ エラーが発生します。
上記のコードを使用して長さを見つけた後、「データ」イベントを発行しないため、ストリームがドレインまたは消費されているようです。
stream.resume() を試しました。しかし、何も機能しません。ストリームを消費せずにストリームの長さを見つける方法を提案してください。