用node的request模块批量下载图片

发布于 2022-09-01 12:15:51 字数 1356 浏览 8 评论 0

我想下载一些图片,图片在网站上是这样来存储的

http://a.com/1.jpg
http://a.com/2.jpg
http://a.com/3.jpg

我的代码如下:

var request = require('request');
var fs = require('fs');
var mkdir = require('mkdirp');

var preUrl = 'http://a.com/';
var dir = './images';

mkdir(dir, function(err) {
if(err) {
    console.log(err);
}
});
for(var i = 1; i <= 10; i++){
  var trueUrl = preUrl + i + '.jpg';
  var name = i + '.jpg';
   request(trueUrl, function(err, response, body) {
  if(!err && response.statusCode == 200) {
      download(trueUrl, dir, name);
      console.log("Done" + trueUrl);
                }
      });                
}
var download = function(url, dir, filename) {
request.head(url, function(err, res, body) {
    request(url).pipe(fs.createWriteStream(dir + '/' + filename));
});
};

但是发现下面的这一部分根本不会运行,即如果我在下面的代码上面输入console.log(111)的话就会循环输出111很多次,而下面的没有动静。。。

request(trueUrl, function(err, response, body) {
      if(!err && response.statusCode == 200) {
          download(trueUrl, dir, name);
          console.log("Done" + trueUrl);
                    }
          });

我哪个地方出问题了?能指点一下吗?


等了等,基本上还是上面的代码,他一直会显示done http://a.com/10.jpg....但是并没有下载下来。。并且电脑会特别卡

最后只是下载到了10.jpg

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情定在深秋 2022-09-08 12:15:51

for循环里面的异步回调中name变量是同一个值了。

一个人的夜不怕黑 2022-09-08 12:15:51

在nodejs中for循环和回调嵌套就是灾难,因为普通运算会跳过回调直接执行,如果回调不够快请求基本上就等于如下代码:

jsvar trueUrl;
var name;
for(var i = 1; i <= 10; i++){
  trueUrl = preUrl + i + '.jpg';
  name = i + '.jpg';         
}
request(trueUrl, function(err, response, body) {
  if(!err && response.statusCode == 200) {
      download(trueUrl, dir, name);
      console.log("Done" + trueUrl);
  }
});       

所以应该换种方式进行操作。

  • 同步的request:[request-sync]
  • 使用数组
  • 把i++ 写到回调函数体内
  • 补充1:使用一个函数把request(url,function(err,response,body){})给封装进去,把trueUrl和name作为参数传进去(推荐);
  • 补充2:推荐使用nodegrass
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文