2010-07-09 4 views
5

Je souhaite télécharger une photo sur facebook pour un utilisateur dans l'album par défaut d'une application. Ceci est décrit dans la publication ici: http://developers.facebook.com/docs/reference/api/photoException lors du téléchargement d'une photo avec Facebook Graph API

La méthode a été répondue ici: How can I upload photos to album using Facebook Graph API. J'utilise les éléments suivants:

$args = array(
    'message' => 'Photo Caption', 
    'image' => '@'.realpath("image.png") 
); 
$data = $facebook->api('/me/photos', 'post', $args); 

Cependant je reçois l'exception « (# 324) Nécessite fichier de téléchargement » lorsque je tente cela. J'ai une session valide et j'ai les permissions publish_stream et user_photos. Je peux récupérer des données en utilisant l'API. Le fichier image est définitivement valide car il peut être chargé avec file_get_contents(realpath("image.png")).

J'ai essayé cette solution, en utilisant curl, qui fonctionne parfaitement: 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); 

Par rapport à la boucle PHP SDK Facebook qui ressemble à ceci (en utilisant les mêmes args $ et $ 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); 

Pourquoi la version PHP ne fonctionne-t-elle pas? On dirait que la fonction http_build_query() interfère avec le chargement de l'image. Je ne connais pas assez curl pour comprendre ce qui se passe ici.

Répondre

12

Je suis tellement content d'avoir fait le même problème Vous devez régler le paramètre fileUpload sur true!

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

Merci beaucoup pour cela - m'a sauvé après une longue période de recherche – Lobe

+0

Si vous utilisez ce, sachez que les messages créés par l'utilisateur peuvent créer le téléchargement de fichiers non intentionnels ou malveillants. – peterjwest

+0

Merci! On pourrait penser que cela serait important dans la documentation pour les téléchargements de photos. . . WTH !!! – TuK

1

Facebook a intentionnellement transformé les champs POST en une chaîne GET en utilisant http_build_query() pour arrêter les champs commençant par @ utilisé accidentellement ou par malveillance pour télécharger des fichiers. Here's the GitHub issue.

Une solution rapide pour cela est de retirer le http_build_query() de src/facebook.php dans le SDK:

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

Devient:

$opts[CURLOPT_POSTFIELDS] = $params; 

Toutefois, si vous faites cela, vous devez prendre des mesures pour filtrer les messages générés par l'utilisateur qui commencent par @. Par exemple, vous pouvez ajouter un espace au début de chaque message.

Questions connexes