【问题标题】:How can I upload photos to album using Facebook Graph API如何使用 Facebook Graph API 将照片上传到相册
【发布时间】:2010-06-03 08:46:20
【问题描述】:

代码如下:

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

这是错误

未捕获的 CurlException: 26: 创建表单数据失败

怎么办?

【问题讨论】:

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

标签: php facebook


【解决方案1】:

以下是使用 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);

【讨论】:

    【解决方案2】:

    你的 $data 数组应该有“message”而不是“caption”, 另外,删除“aid”、“method”和“access_token”
    你的 $data 必须有文件数据和“消息”,就是这样。

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

    在哪里而不是 13595 只需使用带有专辑辅助的变量

    另外,如果需要,最好将 access_token 附加到 api uri,如下所示:

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

    另外,如果 php sdk 不适合你,如果你的 php 安装支持它,我已经成功地使用了 cURL。在这种情况下,请参阅Upload Photo To Album with Facebook's Graph API 的 cURL 示例

    【讨论】:

      【解决方案3】:

      如果没有对代码进行以下更新,最新版本的 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 时;为此,如果我们在 params 数组中有一个 doMultiPart 参数,我们只需切换到传递选项数组。

      这是一个快速的hack,我将其放在一起以使某些东西正常工作,可能需要检查代码以确保它不会破坏您正在做的任何其他事情。否则请尽情享受。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        相关资源
        最近更新 更多