node.js-如何从URL链式下载许多图像

时间:2018-09-25 02:57:36

标签: javascript node.js image download

基本上,我想从图像服务中下载大量图像。我有一个非常大的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"]]

2 个答案:

答案 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);