Facebook API sdk 4.0 – отправить фотографию на facebook

Я пытаюсь создать приложение, в котором пользователь может просматривать и отправлять фотографии со своего компьютера на свою электронную почту. Для этого им сначала нужно будет загрузить свою фотографию на сервер, а затем воспользоваться запросом facebook, разместив это изображение на facebook. Я использую multipart / form-data.

Это то, что у меня до сих пор для этого, предполагая, что у меня есть действующий сеанс, мой запрос api:

$request = new Facebook{ $session, 'POST', '/me/photos', array ( 'source' => '{image-data}', ) ); $response = $request->execute(); $graphObject = $response->getGraphObject(); /* handle the result*/ 

Я не уверен, что заменить изображения-данные.

Для загрузки фотографии мой код выглядит следующим образом:

  if(isset($_POST['submit'])){ $file_type = $_FILES['file']['type']; //returns the file type $allowed = array("image/jpeg", "image/gif", "image/png", "image/jpg"); //specifies allowed file types if(!in_array($file_type, $allowed)) { $error_message = 'Only jpeg, jpg, gif, and png files are allowed. <br> Please click back and try again.'; echo $error_message; exit(); } $name = $_FILES['file']['name']; //original path of the uploaded file $temp_name = $_FILES['file']['tmp_name']; //contains the path to the temporary file that resides on the server if(isset($name)){ if(!empty($name)){ $location = 'uploads/'; //save photo to the folder: uploads if(move_uploaded_file($temp_name, $location.$name)){ echo 'Photo was successfully uploaded.'; } } } else { echo 'Photo was unsuccessfully uploaded, click back and try again.'; } } 

Я новичок в facebook api и новичок в кодировании. Любая помощь или совет будут высоко оценены. Благодарю.

Весь код:

  <?php require_once( 'Facebook/HttpClients/FacebookHttpable.php' ); require_once( 'Facebook/HttpClients/FacebookCurl.php' ); require_once( 'Facebook/HttpClients/FacebookCurlHttpClient.php' ); require_once( 'Facebook/Entities/AccessToken.php' ); require_once( 'Facebook/Entities/SignedRequest.php' ); require_once( 'Facebook/FacebookSession.php' ); require_once( 'Facebook/FacebookRedirectLoginHelper.php' ); require_once( 'Facebook/FacebookRequest.php' ); require_once( 'Facebook/FacebookResponse.php' ); require_once( 'Facebook/FacebookSDKException.php' ); require_once( 'Facebook/FacebookRequestException.php' ); require_once( 'Facebook/FacebookServerException.php' ); require_once( 'Facebook/FacebookOtherException.php' ); require_once( 'Facebook/FacebookAuthorizationException.php' ); require_once( 'Facebook/GraphObject.php' ); require_once( 'Facebook/GraphSessionInfo.php' ); use Facebook\HttpClients\FacebookHttpable; use Facebook\HttpClients\FacebookCurl; use Facebook\HttpClients\FacebookCurlHttpClient; use Facebook\Entities\AccessToken; use Facebook\Entities\SignedRequest; use Facebook\FacebookSession; use Facebook\FacebookRedirectLoginHelper; use Facebook\FacebookRequest; use Facebook\FacebookResponse; use Facebook\FacebookSDKException; use Facebook\FacebookRequestException; use Facebook\FacebookServerException; use Facebook\FacebookOtherException; use Facebook\FacebookAuthorizationException; use Facebook\GraphObject; use Facebook\GraphSessionInfo; // start session session_start(); // init app with app id and secret FacebookSession::setDefaultApplication( 'xxxxxxxxxx','xxxxxxxxxxxxx' ); // login helper with redirect_uri $helper = new FacebookRedirectLoginHelper( 'https://apps.facebook.com/myapp' ); // see if a existing session exists if ( isset( $_SESSION ) && isset( $_SESSION['fb_token'] ) ) { // create new session from saved access_token $session = new FacebookSession( $_SESSION['fb_token'] ); // validate the access_token to make sure it's still valid try { if ( !$session->validate() ) { $session = null; } } catch ( Exception $e ) { // catch any exceptions $session = null; } } if ( !isset( $session ) || $session === null ) { // no session exists try { $session = $helper->getSessionFromRedirect(); } catch( FacebookRequestException $ex ) { // When Facebook returns an error // handle this better in production code print_r( $ex ); } catch( Exception $ex ) { // When validation fails or other local issues // handle this better in production code print_r( $ex ); } } // see if we have a session if ( isset( $session ) ) { // save the session $_SESSION['fb_token'] = $session->getToken(); // create a session using saved token or the new one we generated at login $session = new FacebookSession( $session->getToken() ); // graph api request for user data $request = new FacebookRequest( $session, 'GET', '/me' ); $response = $request->execute(); // get response $graphObject = $response->getGraphObject()->asArray(); // print logout url using session and redirect_uri (destroy the session) echo '<a href="' . $helper->getLogoutUrl( $session, 'http://localhost/app/index.php', session_destroy() ) . '">Logout</a>'; } else { // show login url echo '<a href="' . $helper->getLoginUrl( array( 'email', 'user_friends', 'publish_actions' ) ) . '">Login</a>'; } ?> <html> <head> <title> My App</title> </head> <body> <div> <form method="post" enctype="multipart/form-data"> Please select a photo to upload <input type="file" name="file" id="file"><br><br> <input type="submit" value="Upload" name="submit"> </form> </div> </body> </html> <?php if(isset($_POST['submit'])){ $file_type = $_FILES['file']['type']; //returns the file type $allowed = array("image/jpeg", "image/gif", "image/png", "image/jpg"); //specifies allowed file types if(!in_array($file_type, $allowed)) { $error_message = 'Only jpeg, jpg, gif, and png files are allowed. <br> Please click back and try again.'; echo $error_message; exit(); } $name = $_FILES['file']['name']; //original path of the uploaded file $temp_name = $_FILES['file']['tmp_name']; //contains the path to the temporary file that resides on the server if(isset($name)){ if(!empty($name)){ $location = 'uploads/'; //save photo to the folder: uploads if(move_uploaded_file($temp_name, $location.$name)){ echo 'Photo was successfully uploaded.'; } } } else { echo 'Photo was unsuccessfully uploaded, click back and try again.'; } $session = new FacebookSession( $_SESSION['fb_token']); $request = new FacebookRequest( $session, 'POST', '/me/photos', array ( 'source' => file_get_contents($location.$name), ) ); $response = $request->execute(); $graphObject = $response->getGraphObject(); print_r($response); } $token = $_GET['code']; echo $token; ?> 

    Хорошо, есть два основных вопроса с вашим кодом.

    ПЕРВЫЙ :

    Удалите session_destroy() из вашего кода. Это причина, по которой сеанс удаляется. Затем вы можете удалить второе использование $session = new FacebookSession( $_SESSION['fb_token']); от вашего кода. Вам нужно только сделать этот бит один раз!

    Изменить:

     echo '<a href="' . $helper->getLogoutUrl( $session, 'http://localhost/app/index.php', session_destroy() ) . '">Logout</a>'; 

    в

     echo '<a href="' . $helper->getLogoutUrl( $session, 'http://localhost/app/index.php' ) . '">Logout</a>'; 

    ВТОРОЙ :

    Добавьте @ к своему source и вы обнаружите, что изображение загружено правильно. Например:

     $request = new FacebookRequest( $session, 'POST', '/me/photos', array ( 'source' => new CURLFile( $location.$name ), ) ); 

    CURLFile работает только на PHP 5.5+. Для более ранней версии PHP установите источник:

     'source' => '@' . $location.$name 

    Предполагая, что пользователь правильно загрузил изображение и $location.$name – это путь:

      $request = new FacebookRequest( $session, 'POST', '/me/photos', array ( 'source' => file_get_contents($location.$name), ) ); $response = $request->execute(); $graphObject = $response->getGraphObject(); 

    Или другая возможность – через URL:

      $request = new FacebookRequest( $session, 'POST', '/me/photos', array ( 'url' => $the_url_to_the_image, ) ); $response = $request->execute(); $graphObject = $response->getGraphObject(); 

    И вызов API, который вы делаете ПОСЛЕ загрузки, выполняется пользователем, но это не более чем логично.