2010-07-09 21 views
5

Me gustaría cargar una foto a Facebook para un usuario en el álbum predeterminado para una aplicación. Esto se describe bajo publicación aquí: http://developers.facebook.com/docs/reference/api/photoExcepción al cargar fotos con Facebook Graph API

El método se ha respondido aquí: How can I upload photos to album using Facebook Graph API. Estoy utilizando el siguiente:

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

Sin embargo tengo la excepción "(# 324) Requiere de carga de archivos" cuando intento esto. Tengo una sesión válida y tengo los permisos publish_stream y user_photos. Puedo recuperar datos usando la API. El archivo de imagen es definitivamente válido porque puede cargarse con file_get_contents(realpath("image.png")).

He probado esta solución, utilizando rizo, que funciona a la perfección: 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); 

En comparación con PHP SDK rizo de Facebook que se parece a esto (utilizando los mismos $ args y $ 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); 

¿Por qué no funciona la versión de PHP? Parece que la función http_build_query() está interfiriendo con la carga de la imagen. No sé lo suficiente sobre curl para entender lo que está pasando aquí.

Respuesta

12

Estoy tan contento de haber pasado por el mismo problema ¡Tienes que establecer el archivoUpload param en verdadero!

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

Muchas gracias por esto - me salvaron después de un largo tiempo de búsqueda – Lobe

+0

Si se utiliza este, tenga en cuenta que los mensajes creados por el usuario podrían crear cargas de archivos no intencionales o maliciosos. – peterjwest

+0

Gracias! Podrías pensar que esto sería prominente en la documentación para subir fotos. . . ¡¡¡WTH !!! – TuK

1

Facebook ha transformado intencionalmente los campos POST a una cadena GET utilizando http_build_query() para detener los campos que comienzan con @ siendo utilizados de forma accidental o maliciosa para cargar archivos. Here's the GitHub issue.

Una solución rápida para esto es para eliminar el http_build_query() de src/facebook.php en el SDK:

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

se convierte en:

$opts[CURLOPT_POSTFIELDS] = $params; 

Sin embargo, si usted hace esto usted debe tomar medidas para filtrar los mensajes generados por el usuario que comienzan con @. Por ejemplo, puede agregar un espacio al frente de cada mensaje.

Cuestiones relacionadas