Intereting Posts

Исключение при загрузке фотографии с помощью API-интерфейса Facebook Graph

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

На этот метод был дан ответ: Как загрузить фотографии в альбом с помощью API-интерфейса Facebook . Я использую следующее:

$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, который отлично работает: Загрузите фотографию в альбом с помощью API-интерфейсов Facebook

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

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

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

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; 

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

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

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