2009-10-05 108 views
1

问:如何通过FB API将图像从我的网络服务器上传到Facebook?使用facebook API上传图像

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

我用它来上传相片中的代码如下

<?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); 
} 
?> 

这是行不通的。更具体地说,我不断收到“错误的签名”消息。

代码有什么问题?

+0

什么'的$ args [ 'Lenna.png'] =“@ /家庭/ thoai/htdocs中/是的''@为apps/bemyfans/Lenna.png“;'? – 2009-10-05 03:49:50

+0

是的,那是什么? – timdev 2009-10-05 03:53:36

+0

cURL将发送文件的内容而不是文件名。 – thoaionline 2009-10-05 04:22:24

回答

0

从错误判断,您的请求未被正确签名。

我快速浏览了facebook API文档,并且您的signRequest()函数看起来对我来说很合适。

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

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

查看您正在非常仔细地打电话的Facebook文档。您可能需要从您的签名生成或base64编码中省略该文件,或者谁知道什么。

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

0

您正在使用包括文件参数在内的所有参数来签名请求。要获得正确的签名,您需要签署请求而不是 args中的文件参数。

+0

请扩大您的答案。 – 2012-12-29 20:00:55

-1

我认为你做的一切都是错的 看我的代码

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

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

这对我的作品

2

在这个问题的代码中使用过时的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);