如何使用Facebook Graph API上传照片到相册

3

以下是代码:

$file= 'bbbb.jpg';
$data = array(
            basename($file) => "@".realpath($file),
            "caption" => "Uploaded using graph api",
            "aid" => '13595',
            "access_token" => $accessToken,
            'method' => 'photos.upload'
);
$sds =$facebook->api($data);

这是错误信息

未捕获的Curl异常:26:无法创建表单数据

该怎么办?


这个错误似乎与您尝试上传的文件的权限有关,您确定运行PHP脚本的用户对该文件具有权限吗? - Serty Oan
3个回答

12

以下是使用Graph API上传照片的不同方法。这些示例假设您已经实例化了$facebook对象,并为当前用户拥有一个有效会话。

1- 当前用户的默认应用相册

此示例将照片上传到当前用户的默认应用程序相册。如果相册尚不存在,则会创建它。

$args = array('message' => 'Photo Caption');
$args['image'] = '@' . realpath($FILE_PATH);

$data = $facebook->api('/me/photos', 'post', $args);
print_r($data);

2 - 目标相册

该示例将照片上传到特定相册中。

$args = array('message' => 'Photo Caption');
$args['image'] = '@' . realpath($FILE_PATH);

$data = $facebook->api('/'. $ALBUM_ID . '/photos', 'post', $args);
print_r($data);

3 - 使用访问令牌定位相册

此示例将上传照片到一个需要访问令牌的特定相册。

 $args = array('message' => 'Photo Caption');
$args['image'] = '@' . realpath($FILE_PATH);

$data = $facebook->api('/'. $ALBUM_ID . '/photos?access_token='. $ACCESS_TOKEN, 'post', $args);
print_r($data);

3

你的$data数组应该使用"message"而不是"caption",同时删除"aid"、"method"和"access_token"。
你的$data必须包含文件数据和"message",仅此而已。

$sds =$facebook->api('/me/13595/photos', 'POST', $data);

在这里,您可以使用专辑aid变量代替13595。该变量将作为值传递给api。

如果需要,最好像这样将access_token附加到api uri中:

$sds =$facebook->api('/me/13595/photos?access_token='.$access_token, 'POST', $data);

另外,如果PHP SDK对您无效,您可以尝试使用cURL(如果您的PHP安装支持)。在这种情况下,请参阅Upload Photo To Album with Facebook's Graph API中的cURL示例。


2

如果想要上述例子正常运行,需要对代码进行如下更新,因为 Facebook PHP SDK 的最新版本不再兼容以前的写法。

class Facebook {
...
*Line #539*
protected function makeRequest($url, $params, $ch=null) {
if (!$ch) {
  $ch = curl_init();
}

if( isset($params['doMultiPart']) ) {
    $doMultiPart= true;
    unset($params['doMultiPart']);
} else {
    $doMultiPart= false;
}

$opts = self::$CURL_OPTS;
$opts[CURLOPT_POSTFIELDS] = $doMultiPart ? $params : http_build_query($params, null, '&');
...

基本问题是PHP SDK使用"curl_setopt_array",如果将url编码字符串作为选项值传递,它将以“application/x-www-form-urlencoded”作为数据传递,而你真正想要的是“multipart/form-data”,为此,我们只需在参数数组中具有“doMultiPart”参数时切换到传递选项数组即可。这是我快速组合的一个技巧,以使其运行,可能需要检查代码以确保不会破坏任何其他操作,否则请享用。

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