2010-07-09 9 views
5

Vorrei caricare una foto su Facebook per un utente nell'album predefinito per un'applicazione. Questo è descritto sotto la pubblicazione qui: http://developers.facebook.com/docs/reference/api/photoEccezione durante il caricamento di foto con l'API di Facebook Graph

Il metodo è stato risolto qui: How can I upload photos to album using Facebook Graph API. Sto usando il seguente:

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

Tuttavia ottengo l'eccezione "(# 324) Richiede file di caricamento" quando tento questo. Ho una sessione valida e ho le autorizzazioni publish_stream e user_photos. Posso recuperare i dati usando l'API. Il file immagine è sicuramente valido perché può essere caricato con file_get_contents(realpath("image.png")).

ho provato questa soluzione, usando curl, che funziona perfettamente: 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); 

Rispetto PHP SDK ricciolo di Facebook, che assomiglia a questo (utilizzando gli stessi $ args e $ 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); 

Perché la versione di PHP non funziona? Sembra che la funzione http_build_query() interferisca con il caricamento dell'immagine. Non ne so abbastanza di arricciare per capire cosa sta succedendo qui.

risposta

12

Sono così felice di aver passato lo stesso problema Devi impostare il parametro fileUpload su true!

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

Grazie tanto per questo - mi ha salvato dopo un lungo periodo di ricerca – Lobe

+0

Se si utilizza questo, essere consapevoli del fatto che i messaggi creati dagli utenti possono creare il caricamento di file involontarie o maliziose. – peterjwest

+0

Grazie! Si potrebbe pensare che questo sarebbe importante nella documentazione per i caricamenti di foto. . . WTH !!! – TuK

1

Facebook ha intenzionalmente trasformato i campi POST in una stringa GET utilizzando http_build_query() per interrompere i campi che iniziano con @ utilizzato per caricare accidentalmente o intenzionalmente file. Here's the GitHub issue.

Una soluzione rapida per questo è di rimuovere il http_build_query() da src/facebook.php nel SDK:

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

diventa:

$opts[CURLOPT_POSTFIELDS] = $params; 

Tuttavia, se si esegue questa operazione si dovrebbe intervenire per filtrare i messaggi generati dagli utenti che iniziano con @. Ad esempio è possibile aggiungere uno spazio nella parte anteriore di ciascun messaggio.

Problemi correlati