Php 使用facebook API上传图像

Php 使用facebook API上传图像,php,api,facebook,upload,photo,Php,Api,Facebook,Upload,Photo,问题:如何通过FBAPI将图像从我的Web服务器上传到facebook 我正在编写一个应用程序,从用户的相册中检索图像,进行一些修改(例如添加水印),然后将其发送回相册 我用来上传照片的代码如下 <?php include_once("api/facebook.php"); include_once("config.php"); include_once("utils.php"); include_once("bemyfans.php"); $facebook=new Facebook($

问题:如何通过FBAPI将图像从我的Web服务器上传到facebook

我正在编写一个应用程序,从用户的相册中检索图像,进行一些修改(例如添加水印),然后将其发送回相册

我用来上传照片的代码如下

<?php
include_once("api/facebook.php");
include_once("config.php");
include_once("utils.php");
include_once("bemyfans.php");
$facebook=new Facebook($api_key,$app_secret);
$facebook->require_frame();
$user=$facebook->require_login();
echo "<p>Hello <fb:name useyou='false' uid=\"$user\"/></p>";
$args = array(
  'api_key' => $api_key,
  'call_id'=>microtime(true),
  'v'=>'1.0',
  'format' => 'JSON'
);
$args['Lenna.png']="@/home/thoai/htdocs/apps/bemyfans/Lenna.png";
signRequest($args,$secret);
$ch = curl_init();
$url = 'http://api.facebook.com/restserver.php?method=photos.upload';
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);
if ($data = curl_exec($ch)) echo "done";
echo $data;

function signRequest(&$args, $secret){
  ksort($args);
  $sig = '';
  foreach($args as $k => $v){
    $sig .= $k . '=' . $v;
  }
  $sig .= $secret;
  $args['sig'] = md5($sig);
}
?>

从错误判断,您的请求没有正确签名

我快速查看了facebook API文档,您的signRequest()函数对我来说非常合适

所以我建议你检查一下显而易见的事实:你的$secret是正确的

编辑:你对评论中问题的回答让我现在看到了。我不知道facebook服务器是如何处理二进制数据和签名的,但你的签名是基于带@前缀的路径名。Facebook从未看到该路径名,因为cURL发送文件内容。所以facebook无法重建签名并验证它

仔细查看facebook文档,查看您正在拨打的电话。您可能需要在生成签名时忽略该文件,或者对其进行base64编码,或者谁知道是什么


但很明显,您的代码发送的签名facebook无法验证,因为它从未在您的请求中看到任何类似“@/home/thoai/htdocs/apps/bemyfans/Lenna.png”的内容。

从错误判断,您的请求没有正确签名

我快速查看了facebook API文档,您的signRequest()函数对我来说非常合适

所以我建议你检查一下显而易见的事实:你的$secret是正确的

编辑:你对评论中问题的回答让我现在看到了。我不知道facebook服务器是如何处理二进制数据和签名的,但你的签名是基于带@前缀的路径名。Facebook从未看到该路径名,因为cURL发送文件内容。所以facebook无法重建签名并验证它

仔细查看facebook文档,查看您正在拨打的电话。您可能需要在生成签名时忽略该文件,或者对其进行base64编码,或者谁知道是什么


但很明显,您的代码发送的签名是facebook无法验证的,因为它在您的请求中从未看到任何类似“@/home/thoai/htdocs/apps/bemyfans/Lenna.png”的内容。

您正在使用包括file参数在内的所有参数对请求进行签名。要获得正确的签名,您需要在args中不带file参数的情况下对请求进行签名。

您正在使用包括file参数在内的所有参数对请求进行签名。要获得正确的签名,您需要在args中不使用file参数的情况下对请求进行签名。

我认为您做得完全错误 看看我的代码

$appapikey = 'keykeykey';
$appsecret = 'secretcesret';
$facebook = new Facebook($appapikey, $appsecret);
$user=$facebook->require_login()

$facebook->api_client->photos_upload($file, null, "A test Photo", $user);

这对我来说很管用

我认为你完全做错了 看看我的代码

$appapikey = 'keykeykey';
$appsecret = 'secretcesret';
$facebook = new Facebook($appapikey, $appsecret);
$user=$facebook->require_login()

$facebook->api_client->photos_upload($file, null, "A test Photo", $user);

这对我很有用

这个问题中的代码使用了过时的REST API,很快就会停止使用

现在正确的方法是:

$fbk = new Facebook(/* conf */);
$fbk->setFileUploadSupport(true);

//If you are executing this in a script, and not in a web page with the user logged in:
$fbk->setAccessToken(/* access token from other sources */);

//To add to an album:
$fbk->api("/$albumId/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

//To upload a photo directly (the album will be created automatically):
$fbk->api("/me/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

记住
$fbk->setFileUploadSupport(true)

此问题中的代码使用了过时的REST API,该API将很快停止使用

现在正确的方法是:

$fbk = new Facebook(/* conf */);
$fbk->setFileUploadSupport(true);

//If you are executing this in a script, and not in a web page with the user logged in:
$fbk->setAccessToken(/* access token from other sources */);

//To add to an album:
$fbk->api("/$albumId/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

//To upload a photo directly (the album will be created automatically):
$fbk->api("/me/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

记住
$fbk->setFileUploadSupport(true)

$args['Lenna.png']=“@/home/thoai/htdocs/apps/bemyfans/Lenna.png”中的
@
是什么?cURL将发送文件的内容,而不是文件名。啊,这就是为什么。查看我的更新答案。
$args['Lenna.png']=“@/home/thoai/htdocs/apps/bemyfans/Lenna.png”中的
@
是什么意思?cURL将发送文件的内容,而不是文件名。啊,这就是为什么。查看我的更新答案。请展开你的答案。请展开你的答案。