【发布时间】:2019-08-19 20:39:01
【问题描述】:
我正在读取文件,对其进行压缩和加密,然后在网络上上传/写入。但我需要知道结束流的内容长度(通过读取、压缩、加密后返回的流)才能发出发布请求。
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()。但没有任何效果。您能否建议如何在不消耗流的情况下找到流的长度。
【问题讨论】:
-
没有内容长度就不能发送吗?
-
如果你需要加密打包后的文件大小,你需要先做这个,然后再发布到服务器。您可以将流存储在内存中,等到文件被压缩,然后获取文件大小&您可以使用正确的内容长度标头执行您的发布请求
-
你看到我的回答了吗? @蒂姆
-
@MarcosCasagrande 我检查了你的答案。谢谢你。把它写在磁盘上然后找到长度是个好主意。
标签: javascript node.js stream pipeline needle.js