在下载视频 进行异步请求的时候,怎么获取这个视频的大小呢?
说下目的。
在进行下载视频的时候,想要获取进度条。我的一开始解决方案是,获取content-length的大小,然后用nodejs的progress来进行下载时间管理。但是我不能获取content-length… 然后当我用
let writeStream = fs.createWriteStream(path.join(fuli, filename));
writeStream.on('finish', () => {
log.trace(`视频 ${data.video} 下载完成`);
});
writeStream.on('error', () => {
log.error(`视频 ${data.video} 下载失败`);
});
let req = request(data.video);
req.pipe(writeStream);
但是我用promise包装之后 ,还是会出现无法显示下载时间的进度条。。下面是代码
function downloadVideo(url, dst) {
return new Promise((resolve, reject) => {
request({ uri: url }, (err, res) => {
if (err) {
log.error(err.stack || err);
if (fs.existsSync(dst)) {
fs.unlinkSync(dst); /* remove unfinished file */
}
reject(true);
}
if (fs.existsSync(dst)) {
log.debug('file has been downloaded, download next one!');
resolve(true);
}
log.trace('res.headers', res.headers);
const totalLength = parseInt(res.headers['content-length'], 10);
if (totalLength > 0) {
const ws = fs.createWriteStream(dst);
// progress bar
const barStyle = '[:bar] :current/:total :percent '
+ ':rate/bps :elapsed';
log.debug(`dowloading ${dst}`);
const bar = new ProgressBar(barStyle, {
complete: '=',
incomplete: '-',
width: 60,
total: totalLength,
});
// listening receive data event
res.on('data', (chunk) => {
ws.write(chunk);
bar.tick(chunk.length);
});
// listening finished event
res.on('end', () => {
console.log('\n');
log.ok(`${dst} downloaded!`);
ws.end();
resolve(true);
});
} else {
console.log('\n');
log.warn(`skip empty file: ${dst}`);
resolve(true);
}
});
});
}
1 回复
没有大手子 回复一下么。。。。