Я хотел бы загрузить фотографию в 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, если вы используете пример выше.