Я читаю файл, архивирую и шифрую его, а затем загружаю / пишу по сети.Но мне нужно знать длину содержимого конечного потока (поток, возвращаемый после прохождения через чтение, 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;
} );
Но почтовый запрос не выполняется, ошибка зависания SOCKET.
Похоже, что поток истощается или потребляется, так как он не генерирует событие «data» после определения длины с помощью приведенного выше кода.
Пробовал stream.resume ().Но ничего не работает.Не могли бы вы предложить, как найти длину потока, не потребляя поток.