【问题标题】:Upload a photo to facebook album将照片上传到 Facebook 相册
【发布时间】:2012-09-20 23:53:27
【问题描述】:

我有一个 nodejs (+express + mongodb,gridstore) 后端,想上传一张照片到 Facebook 相册。

我遇到了两种方法。第一个(https://developers.facebook.com/blog/post/526/)需要获取我的图片的完整 url 资源,我没有,因为它是我从 gridstore 中提取的数据, 第二个(https://developers.facebook.com/docs/reference/api/album/)通过 Graph API 的文档记录很差,我无法弄清楚我的请求应该是什么样子。 (表单数据,它应该有哪些字段,如何将我的数据 blob\stream 从 gridstore 转换为它)

这是我目前拥有的,但不起作用:

facebook.uploadPhoto = function (token, albumId, photo, callback) {
    var fb = fermata.json('https://graph.facebook.com/' + albumId);
    fb.photos({access_token:token}).post({'Content-Type':"multipart/form-data"}, {source:{data:photo}}, callback);
};

任何帮助将不胜感激

【问题讨论】:

  • 我建议你从谷歌搜索开始,multipart/form-data 的实际含义。研究其他问题也可能有所帮助,例如:stackoverflow.com/questions/7945949/…
  • @CBroe 谢谢,但我已经阅读了在线阅读的所有内容,并且已经按照 SO 问题的建议使用了 fermata(我在尝试上传照片时遇到了这个问题)。我会更新我的问题以澄清......我可能遗漏了一些非常简单的东西。
  • 为图片创建url并使用第一种方法不是更容易吗?如果您可以使用您的应用程序从 gridstore 获取图像,您还应该能够为这些图像创建唯一的 url。
  • 我尝试走这条路,但找不到构建完整 url 的方法(没有在其中硬编码我的域)

标签: node.js mongodb facebook-graph-api


【解决方案1】:

老实说,我使用 Facebook 图形 API 的经验有限,主要使用 PHP 和 Java。

以下是一些您可能会觉得有用的信息流:

基本上,我建议你在你的实现中加一点点,并按以下方式编码:

  1. 在 Node.js 中创建一个 REST Web 服务函数调用,以使用内部 UID 从 gridstore 输出单个图像。
  2. 对您的 uploadToFacebook 函数进行编码,以使用调用 REST Web 服务函数的图像 URL。

基本上,这将允许您通过将浏览器指向 REST Web 服务来验证图像输出,并避免在您的 uploadToFacebook 函数中进行任何 blob\stream 转换。我假设您将图像存储在 gridstore 和 mongodb 中。

希望对您有所帮助...

【讨论】:

  • 感谢您的回复。我的代码是这样写的,我确实有一个服务可以通过 UID 提取图像并有一个 REST 服务,但是我在上面评论过,我无法找到一种方法来构建我自己的完整 url,而不用硬编码我自己的代码中的域(我需要使用通过 url 上传的方法上传到 facebook)
  • 如果您谈论的是 HTTP 请求,您可以在 request.headers.host 中找到请求主机。但这依赖于传入的请求。
  • @Irivera - 这行得通,但感觉对于一个相当直截了当的问题来说是一个非常糟糕的解决方法
【解决方案2】:

我通过使用poster 模块对facebook graph API 进行简单的POST 解决了这个问题。

var options = {
  uploadUrl: 'https://graph.facebook.com/'+user+'/photos?access_token='+accessToken,
  method: 'POST',
  fileId: 'source',
  fields: {'message':''} // Additional fields according to graph API
};

var fileName = ''; // Local or remote url where to find the image
poster.post(fileName, options, function(err, data) {
  if (err) {
    //Something went wrong
  } else {
    // Everything ok
  }
});

【讨论】:

  • 谢谢,但正如我之前提到的,我没有文件路径,因为这是来自数据库(MongoDB 的 GridStore)的数据
  • 我试过了,但它不起作用......哦,还有一个但是在海报中它不提交 https 请求但即使在我修复它之后,facebook 仍然返回错误 400跨度>
【解决方案3】:

文件没有正确序列化的可能性很大。 Fermata 将通过数据获取节点文件缓冲区。您是否尝试过通过它?

fs.readFile("/path/to/photo.jpg", function (err, data) {
  fermata.json("https://graph.facebook.com/graph/api").post({"Content-Type":"multipart/form-data"},  {fileField:  {data:data, name:"", type:""}  }, callback);
});

添加您的访问令牌等。

【讨论】:

  • 这在我看来也很有可能。在当前版本中,如果数据还不是 Buffer,Fermata 将通过字符串将其强制为一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多