使用 Node.js 下载多个映像

Download multiple images with Node.js

本文关键字:映像 下载 Node js 使用      更新时间:2023-09-26

我需要一次从几个网站下载很多文件,我有这个代码

var http = require('http');
var fs = require('fs');
var arr = ['http://www.bonyfarma.com/images/Bony%20Air.jpg', 'http://www.bonyfarma.com/images/Bony%20A-Booster.jpg'];
for (var i = arr.length - 1; i >= 0; i--) {
    var file = fs.createWriteStream(arr[i].split('/').pop(-1).toLowerCase().replace("%20", "-"));
    var request = http.get(arr[i], function(response) {
        response.pipe(file);
    });
};

但是例如,当我运行此代码时,第一个文件为空,仅下载第二个文件。你能帮我解决这个问题吗?

var http = require('http');
var fs = require('fs');
var arr = ['http://www.bonyfarma.com/images/Bony%20Air.jpg', 'http://www.bonyfarma.com/images/Bony%20A-Booster.jpg'];
for (var i = arr.length - 1; i >= 0; i--) {
    (function(url){
        var file = fs.createWriteStream(url.split('/').pop(-1).toLowerCase().replace("%20", "-"));
        http.get(url, function(response) {
            response.pipe(file);
        });
    })(arr[i]);
};
这样做

的原因是你的file变量被吊在for循环之外。这会导致所有响应都通过管道传输到最后创建的流。

解决此问题的最简单方法是使用简单的Array.prototype.forEach正确限定变量的范围(节点支持此功能):

arr.forEach(function(url) {
    var file = fs.createWriteStream(url.split('/').pop(-1).toLowerCase().replace("%20", "-"));
    var request = http.get(url, function(response) {
        response.pipe(file);
    });
});