我想在应用程序的默认相册中为用户上传照片到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了解不足以了解这里发生了什么。
答案 0 :(得分:12)
我很高兴我遇到了同样的问题 您必须将fileUpload参数设置为true!
$facebook = new Facebook(array(
'appId' => $facebookapi_id,
'secret' => $facebookapi_secret,
'fileUpload' => true,
'cookie' => true
));
答案 1 :(得分:1)
Facebook已故意使用http_build_query()
将POST字段转换为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;
但是,如果这样做,您应该采取措施来过滤以@开头的用户生成的消息。例如,您可以在每条消息的前面添加一个空格。
答案 2 :(得分:1)
如果您使用图形api上传照片,则会收到错误(#200)用户必须已接受TOS。
但是,如果您使用旧的rest api,只需使用上面的示例将网址更改为https://api.facebook.com/method/photos.upload?access_token=xXXXXXXXXXXX。