node.js - Как закачать несколько картинок с URL - PullRequest
0 голосов
/ 25 сентября 2018

По сути, я хочу загрузить большое количество изображений из сервиса изображений.У меня есть очень большой объект JSON со всеми URL-адресами (~ 500 или около того) в этом объекте JSON.Я попробовал несколько пакетов загрузчика изображений npm, а также некоторый другой код, который загружал каждое изображение одновременно;однако около 50% загруженных изображений имели потерю данных при загрузке (большая часть изображения была прозрачной при просмотре).Как я могу загрузить каждое изображение, одно за другим (ожидая, пока последнее не будет завершено, прежде чем начинать следующее), чтобы избежать потери данных?

Редактировать: вот соответствующий код, используя запрос :

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)});
});  

My links JSON выглядит так:

[["link.one.com/image-jpeg"], ["link.two.com/image-jpeg"]]

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Хорошо, так что обо всем по порядку:

Я действительно не верю, что загрузка этих 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);
0 голосов
/ 25 сентября 2018

Поскольку вы делаете большое количество загрузок, попробуйте Aria2c .Используйте Aria2 документацию для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...