基本上,我想从图像服务中下载大量图像。我有一个非常大的JSON对象,其中包含该JSON对象中的所有URL(约500个左右)。我尝试了一些npm image downlader软件包以及其他一些代码,这些代码可以一次下载所有图像。但是,约有50%的下载图像在下载时丢失了数据(查看时图像的大部分是透明的)。如何才能依次下载每张图像(等到最后一个图像完成之后再开始下一个图像),以免丢失数据?
编辑:以下是相关代码,使用request:
var download = function(url, dest, callback){
request.get(url)
.on('error', function(err) {console.log(err)} )
.pipe(fs.createWriteStream(dest))
.on('close', callback);
};
links.forEach( function(str) {
var filename = str[0].split('/').pop() + '.jpeg';
console.log(filename);
console.log('Downloading ' + filename);
download(str[0], filename, function(){console.log('Finished Downloading ' + filename)});
});
我的links
JSON如下:
[["link.one.com/image-jpeg"], ["link.two.com/image-jpeg"]]
答案 0 :(得分:0)
由于您进行了大量下载,请尝试Aria2c。使用Aria2 documentations了解更多详细信息。
答案 1 :(得分:0)
好的,首先要做的是:
我真的不相信下载那500多个图像会立即开始。 V8引擎(nodejs
代码执行器的一种)实际上管理着合理数量的线程,并重新使用它们来完成任务。因此,它不会创建“很多”新线程,但是会等待其他线程完成。
现在,即使所有内容都立即开始,我也不认为文件会被损坏。如果文件损坏了,您将无法打开这些文件。
所以,我很确定图像的问题不是您的想法。
现在,对于原始问题,并测试我是否有错,您可以尝试按以下顺序下载这些文件:
var recursiveDowload = function (urlArray, nameArray, i) {
if (i < urlArray.length) {
request.get(urlArray[i])
.on('error', function(err) {console.log(err)} )
.pipe(fs.createWriteStream(nameArray[i]))
.on('close', function () { recursiveDownload (urlArray, nameArrya, i+1); });
}
}
recursiveDownload(allUrlArrya, allNameArray, 0);