2010-07-09 5 views
5

Я хотел бы загрузить фотографию в facebook для пользователя в альбом по умолчанию для приложения. Это описано ниже при публикации: http://developers.facebook.com/docs/reference/api/photoИсключение при загрузке фотографии с помощью Facebook Graph API

На этот метод был дан ответ: How can I upload photos to album using Facebook Graph API. Я использую следующие:

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

Однако я получаю исключение «(# 324) Требуется файл для загрузки», когда я пытаюсь это. У меня есть действующий сеанс, и у меня есть права publish_stream и user_photos. Я могу получить данные с помощью API. Файл изображения определенно действителен, так как он может быть загружен file_get_contents(realpath("image.png")).

Я попытался это решение, используя завиток, который отлично работает: 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); 

По сравнению с PHP SDK завитка Facebook, которая выглядит следующим образом (используя те же $ арг и $ 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); 

Почему версия PHP не работает? Похоже, что функция http_build_query() мешает загрузке изображения. Я не знаю достаточно о завитке, чтобы понять, что здесь происходит.

ответ

12

Я так рад, что пошел по той же проблеме Вы должны установить параметр fileUpload true!

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

спасибо за это - спас меня после долгого времени поиска – Lobe

+0

Если вы используете это, имейте в виду, что созданные пользователем сообщения могут создавать желательные или вредоносные загрузки файлов. – peterjwest

+0

Спасибо! Вы могли бы подумать, что это будет заметно в документации для загрузки фотографий. , , WTH !!! – TuK

1

Facebook намеренно преобразует поля POST в строку GET с использованием http_build_query(), чтобы остановить поля, начинающиеся с @, которые используются для случайного или злонамеренного загрузки файлов. Here's the GitHub issue.

Быстро исправить это, чтобы удалить http_build_query() из SRC/facebook.php в SDK:

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

СТАНОВИТСЯ:

$opts[CURLOPT_POSTFIELDS] = $params; 

Однако, если вы сделаете это, вы должны принять меры для фильтрации генерируемых пользователем сообщений, которые начинаются с @. Например, вы можете добавить пространство перед каждым сообщением.

1

Если вы используете график api для загрузки фотографии, он получит ошибку (# 200) Пользователь должен принять TOS.

Однако, если вы используете старый rest api, просто измените URL на https://api.facebook.com/method/photos.upload?access_token=xXXXXXXXXXXX, если вы используете пример выше.

Смежные вопросы