【问题标题】:NodeJS: How to save facebook profile pictureNodeJS:如何保存 Facebook 个人资料图片
【发布时间】:2015-05-07 18:18:39
【问题描述】:

我正在使用 express 和 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 pic 就会破坏脚本。

【问题讨论】:

  • 该示例图像中发生了什么:p

标签: node.js express


【解决方案1】:

我最终想出了一个有效的功能:

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!')
    })

【讨论】:

  • Facebook 的 API 要求 graph.facebook.com/:uid/picture 重定向到另一个 URL。您的代码尝试从第一个 URL 下载图片,导致 302 并且没有图像被检索!有机会更新这段代码吗? :-)
【解决方案2】:

我知道我的回答有点晚了,但我希望它能帮助我们解决这个问题的其他人,所以这里是:

可以通过这种方式将文件保存到 Node 服务器的根目录:

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 });

应该可以的。

【讨论】:

  • 我们的应用程序会存放在哪个路径图上,能否详细说明一下。
  • 如果我理解您的要求,就像答案状态一样,您可以在保存的图像名称之前将您希望保存图像的路径作为参数添加到createWriteStream 函数,例如:request(imageLink).pipe(fs.createWriteStream("/path/to/resultIMG.png")).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多