使用Facebook Graph API上传照片时出现异常

5
我想为一个应用程序的用户上传一张照片到Facebook的默认相册中。这在发布页面中有描述:http://developers.facebook.com/docs/reference/api/photo 该方法已在此处得到回答:如何使用Facebook Graph API上传照片到相册。我正在使用以下内容:
$args = array(
  'message' => 'Photo Caption', 
  'image' => '@'.realpath("image.png")
);
$data = $facebook->api('/me/photos', 'post', $args);

然而,当我尝试这样做时,出现了异常“(#324)需要上传文件”。我有一个有效的会话,并且我拥有publish_stream和user_photos权限。我可以使用API检索数据。图像文件绝对有效,因为可以使用file_get_contents(realpath("image.png"))加载它。
我尝试了这个解决方案,使用curl,它完美地工作: 使用Facebook的Graph API上传照片到相册
$args = array(
  'message' => 'Photo from application',
  'pic.png' => '@'.realpath('pic.png')
);
$tok = $session['access_token']
$url = 'http://graph.facebook.com/'.$album_id.'/photos?access_token='.$tok;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
$data = curl_exec($ch);

与 Facebook 的 PHP SDK curl 相比,它看起来像这样(使用相同的 $args 和 $url):
$ch = curl_init();
$opts = self::$CURL_OPTS;
$opts[CURLOPT_POSTFIELDS] = http_build_query($args, null, '&');
$opts[CURLOPT_URL] = $url;
curl_setopt_array($ch, $opts);
$data= curl_exec($ch);

为什么 PHP 版本不起作用?看起来 http_build_query() 函数会干扰加载图片。我对 cURL 不太了解,无法理解这里发生了什么。

3个回答

12

我很高兴我遇到了同样的问题。 你需要将fileUpload参数设置为true!

$facebook = new Facebook(array(
            'appId'  => $facebookapi_id,
            'secret' => $facebookapi_secret,
            'fileUpload' => true,
            'cookie' => true
          ));  

非常感谢您,这个帮我省去了漫长的搜索时间。 - Lobe
如果您使用此功能,请注意用户创建的消息可能会导致意外或恶意文件上传。 - peterjwest
谢谢!你会认为这在照片上传的文档中会很突出...WTH!!! - TuK
不使用软件开发工具包(SDK),如何使用它? - Mr Sorbose

1

Facebook故意使用http_build_query()将POST字段转换为GET字符串,以防止以@开头的字段被误用或恶意上传文件。 这是GitHub问题链接。

解决此问题的快速方法是从SDK中的src/facebook.php中删除http_build_query()

$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');

变成:

$opts[CURLOPT_POSTFIELDS] = $params;

然而,如果您这样做,应该采取措施来过滤以@开头的用户生成消息。例如,您可以在每条消息前面添加一个空格。


1

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