2011-09-27 157 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

我已经知道了这个想法并且也适用,它的工作正常。 –

相关问题