在下载视频 进行异步请求的时候,怎么获取这个视频的大小呢?
发布于 7 年前 作者 guirenpei 3253 次浏览 来自 问答

说下目的。

在进行下载视频的时候,想要获取进度条。我的一开始解决方案是,获取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 回复

没有大手子 回复一下么。。。。

回到顶部