2011-09-27 6 views
3

expressとnodejsを使用していて、Facebookのプロフィール画像を私のサーバーに保存する際に問題があります。絵のNodeJS:facebookプロフィールの画像を保存する方法

場所:http://profile.ak.fbcdn.net/hprofile-ak-ash2/275619_223605264_963427746_n.jpg

スクリプトが使用されて:

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

    var options = { 
     host: 'http://profile.ak.fbcdn.net', 
     port: 80, 
     path: '/hprofile-ak-ash2/275619_223605264_963427746_n.jpg' 
    } 

    var request = http.get(options, function(res){ 
     res.setEncoding('binary') 

     var imagedata = '' 
     res.on('data', function (chunk) {imagedata += chunk}) 

     res.on('end', function(){ 
     fs.writeFile('logo.jpg', imagedata, 'binary', function (err) { 
      if(err){throw err} 
      console.log('It\'s saved!'); 
     }) 
     }) 
    }) 

画像が保存されますが、空です。コンソールログの画像データも空です。私のために働くI followed this example origionally。単に画像の位置をFacebookの写真に変更すると、スクリプトが中断されます。

+0

このサンプル画像では何が起こっていますか:p – Mustafa

答えて

8

は、私が働いていた機能を考え出すことになった:

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

var getImg = function(o, cb){ 
    var port = o.port || 80, 
     url  = url.parse(o.url); 

    var options = { 
     host: url.hostname, 
     port: port, 
     path: url.pathname 
    }; 

    http.get(options, function(res) { 
     console.log("Got response: " + res.statusCode); 
     res.setEncoding('binary') 
     var imagedata = '' 
     res.on('data', function(chunk){ 
      imagedata+= chunk; 
     }); 
     res.on('end', function(){ 
      fs.writeFile(o.dest, imagedata, 'binary', cb); 
     }); 
    }).on('error', function(e) { 
     console.log("Got error: " + e.message); 
    }); 
} 

USAGE:

getImg({ 
     url: "http://UrlToImage.com", 
     dest: __dirname + '/your/path/to/save/imageName.jpg' 
    },function(err){ 
     console.log('image saved!') 
    }) 
+1

FacebookのAPIには別のURLにリダイレクトするhttp://graph.facebook.com/:uid/pictureが必要です。あなたのコードは最初のURLから画像をダウンロードしようとしますが、結果は302になり、画像は取り込まれません!このコードを更新する機会はありますか? :-) – Sven

2

私は私の答えは少し遅れているけど、私はそれが他の人を助けいただければ幸いです

ノードサーバーのルートディレクトリにファイルを保存するには、次のようにします。

var request = require("request"); 
var fs = require("fs"); 
var fbUserId = 4; 
var imageLink = "https://graph.facebook.com/"+ fbUserId +"/picture?width=500&height=500"; 

request(imageLink).pipe(fs.createWriteStream("resultIMG.png")) 
    .on('close', function(){ 
     console.log("saving process is done!"); 
    }); 

もちろん、画像に必要な任意のパスをファイル名文字列の前に追加できます。

あなたはまだ空の画像が表示される場合、このように、nullに要求モジュールのエンコーディングを設定します。それを行う必要があり

var request = require("request").defaults({ encoding: null }); 

+0

私たちのアプリケーションが保存されるパス画像はどれですか? –

+0

回答の状態のように、あなたが保存したい画像の名前の前に 'createWriteStream'関数に保存する画像を望むパスを追加することができます。' request(imageLink) .pipe(fs.createWriteStream( "/ path/to/resultIMG.png")) '。 –

+0

私はすでにこのアイデアを得て、そのうまくいっています。 –