gpt4 book ai didi

javascript - Node.js中如何一一下载文件?

转载 作者:行者123 更新时间:2023-12-02 23:11:01 24 4
gpt4 key购买 nike

我正在尝试使用请求库下载多个文件,我需要将它们一一下载并显示进度条,文件链接存储在一个数组中,该数组将它们传递给一个函数以开始下载

const request = require('request')
const fs = require('fs')
const ProgressBar = require('progress')

async function downloadFiles(links) {
for (let link of links) {
let file = request(link)
file.on('response', (res) => {
var len = parseInt(res.headers['content-length'], 10);
console.log();
bar = new ProgressBar(' Downloading [:bar] :rate/bps :percent :etas', {
complete: '=',
incomplete: ' ',
width: 20,
total: len
});
file.on('data', (chunk) => {
bar.tick(chunk.length);
})
file.on('end', () => {
console.log('\n');
})
})
file.pipe(fs.createWriteStream('./downloads/' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)))
}
}


let links = ['https://speed.hetzner.de/100MB.bin', 'https://speed.hetzner.de/100MB.bin', 'https://speed.hetzner.de/100MB.bin', 'https://speed.hetzner.de/100MB.bin']
downloadFiles(links)

这就是我到目前为止所得到的,问题是请求是异步的,我尝试使用 async/await 但这样我无法让进度条工作。如何才能让文件一次下载一个,并且还有进度条呢?

最佳答案

基于我对 async.queue 的评论,这就是我要写的方式。您可以调用dl.downloadFiles([])只要您想要,它就会依次获取您添加到队列中的所有内容。

const request = require('request')
const async = require('async')
const fs = require('fs')
const ProgressBar = require('progress')

class Downloader {
constructor() {
this.q = async.queue(this.singleFile, 1);

// assign a callback
this.q.drain(function() {
console.log('all items have been processed');
});

// assign an error callback
this.q.error(function(err, task) {
console.error('task experienced an error', task);
});
}

downloadFiles(links) {
for (let link of links) {
this.q.push(link);
}
}

singleFile(link, cb) {
let file = request(link);
let bar;
file.on('response', (res) => {
const len = parseInt(res.headers['content-length'], 10);
console.log();
bar = new ProgressBar(' Downloading [:bar] :rate/bps :percent :etas', {
complete: '=',
incomplete: ' ',
width: 20,
total: len
});
file.on('data', (chunk) => {
bar.tick(chunk.length);
})
file.on('end', () => {
console.log('\n');
cb();
})
})
file.pipe(fs.createWriteStream('./downloads/' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)))
}
}

const dl = new Downloader();

dl.downloadFiles([
'https://speed.hetzner.de/100MB.bin',
'https://speed.hetzner.de/100MB.bin'
]);

关于javascript - Node.js中如何一一下载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57362319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com