【问题标题】:Exception when uploading photo with Facebook Graph API使用 Facebook Graph API 上传照片时出现异常
【发布时间】:2011-03-13 19:44:05
【问题描述】:

我想在应用程序的默认相册中为用户上传一张照片到 facebook。这在此处发布下进行了描述: http://developers.facebook.com/docs/reference/api/photo

这里已经回答了这个方法:How can I upload photos to album using 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 尝试过这个解决方案,效果很好: Upload Photo To Album with Facebook's 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 了解得不够多,无法理解这里发生了什么。

【问题讨论】:

    标签: php facebook facebook-graph-api photo-upload


    【解决方案1】:

    我很高兴我遇到了同样的问题 您必须将 fileUpload 参数设置为 true !

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

    【讨论】:

    • 非常感谢 - 经过长时间的搜索后救了我
    • 如果您使用它,请注意用户创建的消息可能会导致无意或恶意文件上传。
    • 谢谢!您会认为这在照片上传的文档中会很突出。 . .哇!!!
    • 不使用SDK如何使用?
    【解决方案2】:

    Facebook 有意将 POST 字段转换为使用 http_build_query() 的 GET 字符串,以阻止以 @ 开头的字段被用于意外或恶意上传文件。 Here's the GitHub issue.

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

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

    变成:

    $opts[CURLOPT_POSTFIELDS] = $params;
    

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

    【讨论】:

      【解决方案3】:

      如果你使用graph api上传照片会报错(#200) User must have accepted TOS.

      但是,如果您使用旧的 rest api,如果您使用上面的示例,只需将 url 更改为https://api.facebook.com/method/photos.upload?access_token=xXXXXXXXXXXX

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        相关资源
        最近更新 更多