0

ファイルを読み取り、圧縮して暗号化し、ネットワークにアップロード/書き込みしています。しかし、投稿リクエストを行うには、最後のストリーム(読み取り、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() を試しました。しかし、何も機能しません。ストリームを消費せずにストリームの長さを見つける方法を提案してください。

4

1 に答える 1