简体   繁体   中英

Facebook API sdk 4.0 - post a photo onto facebook

I am trying to create an application where the user can browse and submit a photo from their computer onto their facebook. For this, they will first have to upload their photo onto the server and then using a facebook request, post this image onto facebook. I am using multipart/form-data.

This is what I have so far for this, assuming I have a valid session, my api request:

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

I am not sure what to replace image-data with.

For the uploading photo, my code is as follows:

   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.';
 }
 }

I am new to facebook api, and a novice at coding. Any help or advice will be much appreciated. Thanks.

Whole code:

     <?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;


     ?>

OK, there are two main issues with your code.

FIRST :

Remove session_destroy() from your code. It's the reason why the session is being deleted. You can then remove the second use of $session = new FacebookSession( $_SESSION['fb_token']); from your code. You only need to do that bit once!

Change:

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

to

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

SECOND :

Append @ to your source and you will find that the image uploads correctly. Eg:

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

CURLFile only works on PHP 5.5+. For earlier version of PHP, set source to:

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

Assuming that the user has correctly uploaded the image and $location.$name is the path:

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

 $response = $request->execute();
 $graphObject = $response->getGraphObject();

Or another possibility is via URL:

 $request = new FacebookRequest(
   $session,
   'POST',
   '/me/photos',
   array (
     'url' => $the_url_to_the_image,
   )
 );

 $response = $request->execute();
 $graphObject = $response->getGraphObject();

And the API call you do AFTER the upload is done by the user but that is not more than logical.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM