Исключение при загрузке фотографии с Facebook Graph API - PullRequest
5 голосов
/ 09 июля 2010

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

Метод получил ответ здесь: Как загрузить фотографии в альбом, используя 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")).

Я пробовал это решение, используя curl, который отлично работает: Загрузить фото в альбом с Facebook API Graph

$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 curl PHP SDK, который выглядит следующим образом (с использованием тех же $ args и $ 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 () мешает загрузке изображения.Я не знаю достаточно о керле, чтобы понять, что здесь происходит.

Ответы [ 3 ]

12 голосов
/ 23 сентября 2010

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

$facebook = new Facebook(array(
            'appId'  => $facebookapi_id,
            'secret' => $facebookapi_secret,
            'fileUpload' => true,
            'cookie' => true
          ));  
1 голос
/ 26 августа 2010

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

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

1 голос
/ 16 июля 2010

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

Быстрое решение этой проблемы - удалить http_build_query() из src / facebook.php в SDK:

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

становится:

$opts[CURLOPT_POSTFIELDS] = $params;

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

...