2016-05-30 17 views
0

ノードから画像をサーバーからダウンロードしてサーバーに保存するための小さな関数を書きましたが、動作しません。イメージファイルが作成され、破損しているように思われ、ここでの関数があります:イメージをダウンロードできません:NodeJS

function d() { 
    var data = [ 
     { 
      img: "http://wow.zamimg.com/images/hearthstone/cards/enus/original/OG_134.png", 
      cardId: "yogg" 
     }, 
     { 
      img: "http://wow.zamimg.com/images/hearthstone/cards/enus/original/HERO_07.png", 
      cardId: "nzoth" 
     } 
    ]; 
    for(var card of data) { 
     if("img" in card) { 
      var img = require('fs').createWriteStream("./public/assets/pics/" + card.cardId + ".png"); 
      require("http").get(card.img, (res) => { 
       res.pipe(img); 
      }); 
     } 
    } 
} 

私が間違って何をしているのですか?

答えて

1

問題は、ダウンロードが完了する前にプロセスが終了することです。 http.get関数は並列に実行されるため、何らかの方法でそれを処理する必要があります。 asyncモジュールを使用してこれを行うことができます。

function d() { 
var data = [ 
    { 
     img: "http://wow.zamimg.com/images/hearthstone/cards/enus/original/OG_134.png", 
     cardId: "yogg" 
    }, 
    { 
     img: "http://wow.zamimg.com/images/hearthstone/cards/enus/original/HERO_07.png", 
     cardId: "nzoth" 
    } 
]; 
var async = require('async') 
async.each(data, (card, next) => { 
    if("img" in card) { 
     var img = require('fs').createWriteStream(card.cardId + ".png"); 
      require("http").get(card.img, (res) => { 
       res.pipe(img).on('end', next) 
      }); 
    } 
} 
,() => { 
    console.log(done) 
}) 
} 
+0

ありがとう!完璧に動作します。 –

1

使用この:

var fs = require('fs'), 
    request = require('request'); 

var download = function(uri, filename, callback){ 
    request.head(uri, function(err, res, body){ 
    console.log('content-type:', res.headers['content-type']); 
    console.log('content-length:', res.headers['content-length']); 

    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback); 
    }); 
}; 

download('https://www.THE_URL.com/image.png', 'THE_NAME.png', function(){ 
    console.log('Image saved!'); 
}); 
関連する問題