2011-09-27 147 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); 
    }); 
} 

用法:

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。您的代碼嘗試從第一個網址下載圖片,這會導致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( 「/路徑/到/ resultIMG.png」))'。 –

+0

我已經知道了這個想法並且也適用,它的工作正常。 –

相關問題