2016-11-29 16 views
0

node.jsを使用して大きな画像(〜2MB以上)をダウンロードする方法を探しています。私はすべての種類のソリューションを試して高低を検索しました。画像がダウンロードされても、一部は一貫して壊れています。Node.jsダウンロードした画像が破損しました

たとえば、次のコードを使用してこのサンプルイメージをダウンロードしても、イメージは半分しかダウンロードされません。

var http = require('http') 
var fs = require('fs') 

var options = { 
    host:'images.clipartpanda.com', 
    port:80, 
    path:'http://images.clipartpanda.com/writing-clip-art-xTgn7KXTA.jpeg' 
}; 
    var downloadImage = function (options, fileName) { 
     http.get(options, function (res) { 
      var imageData = ''; 
      res.setEncoding('binary'); 
      res.on('data', function (chunk) { 
       imageData += chunk; 
      }); 
      res.on('end', function() { 
       fs.writeFile(fileName, imageData, 'binary', function(err){ 
        if(err) throw err; 
        console.log('File: ' + fileName + " written!"); 
       }) 
      }); 
     }); 
    }; 

downloadImage(options,'writing-clip-art-xTgn7KXTA.jpeg'); 

私はNode.jsのv4.2.6でのUbuntu v16.04仮想マシンを使用しています私もNPMの画像ダウンローダを使用してみましたが、私は同じ結果

var image_downloader = require('image-downloader');  
var options = { 
    url: 'http://images.clipartpanda.com/writing-clip-art-xTgn7KXTA.jpeg', 
    dest: '/home', 
    done: function (err, filename, image) { 
     if (err) { 
      console.log(err); 

     } else { 
      console.log('File saved to', filename); 
     } 
    }, 
}; 


image_downloader(options); 

を取得しています。

-UPDATE-

は答え以下&コメント(今createWriteStreamを使用)ごとに次のコードを使用してみましたが、ファイルがまだダウンロード時に破損しています。

var http = require('http') 
var fs = require('fs') 

var options = { 
    host:'images.clipartpanda.com', 
    port:80, 
    path:'http://images.clipartpanda.com/writing-clip-art-xTgn7KXTA.jpeg' 
}; 
var fileName = 'writing-clip-art-xTgn7KXTA.jpeg'; 

http.get(options, function (res) { 
    var stream = fs.createWriteStream(fileName); 
    res.pipe(stream); 
}); 

すべての今して、私はまた、このようなエラーが表示されます。

Command: node "/home/test.js" 
events.js:141 
     throw er; // Unhandled 'error' event 
    ^
Error: read ECONNRESET 
    at exports._errnoException (util.js:870:11) 
    at TCP.onread (net.js:544:26) 
Program exited with code 1 

- UPDATE 2 -

この問題を解決するために数え切れないほどの時間のために検索した後、私は」だと思いますそれを理解しました。真を使用するために必要な:ソケット接続が死んで、キープアライブを保っているようだ

request({url: options.url, encoding: null, forever:true}, function (err, response, body) { 

21行に画像download.jsファイル内のリクエストに:私は{真の永遠}追加する必要がありました。

+0

イメージデータをすべて作成して書き込むのではなく、データを受け取ったときにファイルに書き込んだことがありますか? –

+0

更新されたコードは私のために働きます。ダウンロードしたファイルは106045バイトにする必要があります。あなたはそれを見ていますか? – tcooc

+0

@tcooc時々私は〜60KB、時には〜53KB、時には "ECONNRESET"となっています。私は完全なファイルをまだダウンロードできませんでした。私のnode.jsの設定に、私が見なければならないものがありますか? –

答えて

1

バイナリデータを取得していますが、文字列に追加しています。

あなたがすべきことは、バッファーに関する作業です。ここでは、バッファを追加する方法です:

var newBuffer = Buffer.concat([buffer1, buffer2]); 

ので、代わりの文字列にデータを追加、アレイへのすべてのバッファを追加し、最後に全てのバッファを連結するBuffer.concatを使用しています。参照: Buffer.concat()

さらに、ストリームで作業することもできます(コメントの中で指摘してくれたSteven Schobertのおかげで)。

http.get(options, function (res) { 
    var stream = fs.createWriteStream(fileName); 
    res.pipe(stream); 
}); 

はまたrequestのように、より高いレベルのAPIを使用して:あなたはこのような何かプラスいくつかのエラーチェックやロギングを行うことができます。

レート制限やその他の利用規約を超えているため、サーバーがリクエストに対して不完全または無効な応答を与える可能性があることを除外できません。

+0

おそらく 'fs.createWriteStream'の良いユースケースです。 –

+0

@StevenSchobert良い点。私は答えに加えました。ありがとう。 – rsp

+0

おかげさまで、イメージダウンローダはすでにhttps://github.com/demsking/image-downloader/blob/master/index.jsリクエストを使用していますが、fs.createWriteStreamを使用していないようです –

関連する問題