2
votes

I'm trying to upload www hosted (e.g. http://www.google.se/intl/en_com/images/srpr/logo1w.png) files to a facebook album.

Creating an album works just fine, but I don't seem to uploading any photos. I'm using the facebook php-sdk ( http://github.com/facebook/php-sdk/ ) and the examples I already tried are:

Upload Photo To Album with Facebook's Graph API

How can I upload photos to album using Facebook Graph API

I'm guessing CURL uploads perhaps only can manage locally stored files and not web hosted ones.

Here's my code:

      /*
  Try 1:

  $data = array();
  $data['message'] = $attachment->post_title;
  $data['file'] = $attachment->guid;

  try {
   $photo = $facebook->api('/' . $album['id'] . '/photos?access_token=' . $session['access_token'], 'post', $data);
  } catch (FacebookApiException $e) {
   error_log($e);
  }
  */

  // Try 2:
  //upload photo
  $file = $attachment->guid;
  $args = array(
   'message' => 'Photo from application',
  );
  $args[basename($file)] = '@' . realpath(file_get_contents($file));

  $ch = curl_init();
  $url = 'https://graph.facebook.com/' . $album['id'] . '/photos?access_token=' . $session['access_token'];
  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);
  //returns the photo id
  print_r(json_decode($data,true));

...where attachment->guid contains the photo url.

I'm pretty much stuck right now...

3

3 Answers

2
votes

i think the problem is here:

$args[basename($file)] = '@' . realpath(file_get_contents($file));

since you want to post a picture from another source (right?), you should save it temporarily on your own host.

i also needed to do something like this, and since i had to process the image, i used the following way:

$im = @imagecreatefrompng('http://www.google.se/intl/en_com/images/srpr/logo1w.png');
imagejpeg($im, 'imgs/temp/temp.jpg', 85);

$args['image'] = '@' . realpath('imgs/temp/temp.jpg');

the rest looks fine though

0
votes

I'll suggest to use the Facebook php SDK, it will be easier and the code will work with future updates of the APIs:


Using the Graph API php sdk:

$fbk = new Facebook(/* conf */);
$fbk->setFileUploadSupport(true);

//If you are executing this in a script, and not in a web page with the user logged in:
$fbk->setAccessToken(/* access token from other sources */);

//To add to an album:
$fbk->api("/$albumId/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

//To upload a photo directly (the album will be created automatically):
$fbk->api("/me/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

Using cURL directly:

If your really want to use cURL, your code is almost correct, but the error is in the $args array:

$args = array(
   'message' => 'Photo from application',
   'source' => file_get_contents($file)
  );

Since the key for the photo data is source, see the Facebook Doc


Note on the @ in cURL:

Also notice that the @ in cUrl means that the parameter will be replaced with the actual bytes of the file that follows the @, so it isn't required if you already put in the source parameter the actual bytes.

0
votes

I'm guessing CURL uploads perhaps only can manage locally stored files and not web hosted ones.

No, that’s not the case.

But you need to give the full, publicly reachable HTTP URL to the image, without an @ in front – and you have to use the parameter name url for this value.

https://developers.facebook.com/docs/reference/api/photo/:

You can also publish a photo by providing a url param with the photo's URL.