上传照片到Facebook相册。

4
我有一个使用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);
};

任何帮助将不胜感激。

我建议你首先Google一下multipart/form-data的实际含义。此外,研究其他的问题也可能会有所帮助,例如这个问题:https://dev59.com/OFzUa4cB1Zd3GeqP57qd - CBroe
@CBroe 谢谢,但我已经阅读了所有在线资料,并且已经像SO问题建议的那样使用fermata(在尝试上传照片时遇到)。我会更新我的问题以澄清...我可能错过了一些非常简单的东西。 - Nadav
用第一种方法创建图像的URL不是更容易吗?如果您可以使用应用程序从Gridstore获取图像,那么也应该能够为这些图像创建唯一的URL。 - Tiddo
我尝试走这条路,但找不到构建完整URL的方法(而不是在其中硬编码我的域)。 - Nadav
https://dev59.com/lms05IYBdhLWcg3wAdST - CBroe
这个有什么问题?你没有提供API的响应意见? - Sammaye
3个回答

4

很有可能文件没有被正确地序列化。Fermata将通过data接收一个节点文件缓冲区。您尝试过传递它吗?

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

添加您的访问令牌等等...


这对我来说似乎也很可能。在当前版本中,如果数据不是一个缓冲区,Fermata将通过字符串强制转换为缓冲区。 - natevw

1

我通过使用poster模块向Facebook图形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)的数据。 - Nadav
我尝试了这个,但它不起作用...哦,还有一个问题是在海报中无法提交https请求,即使我已经修复了它,Facebook仍然返回错误400。 - Nadav

0
说实话,我在使用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)。 - Nadav
如果你在谈论一个HTTP请求,你可以在request.headers.host中找到请求的主机。但这取决于传入的请求。 - lrivera
@Irivera - 这样做虽然有效,但感觉像是一个非常糟糕的变通方法来解决一个相当简单的问题。 - Nadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接