[英]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. 我正在尝试创建一个应用程序,用户可以在其中浏览照片并将照片从其计算机提交到其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.
为此,他们将首先必须将其照片上传到服务器,然后使用Facebook请求将其发布到Facebook。 I am using multipart/form-data.
我正在使用multipart / form-data。
This is what I have so far for this, assuming I have a valid session, my api request: 到目前为止,这是我为此准备的,假设我有一个有效的会话,即我的api请求:
$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. 我是Facebook api的新手,也是编码的新手。 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. 从您的代码中删除
session_destroy()
。 It's the reason why the session is being deleted. 这就是删除会话的原因。 You can then remove the second use of
$session = new FacebookSession( $_SESSION['fb_token']);
然后,您可以删除
$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. 将
@
附加到您的source
,您将发现图像正确上传。 Eg: 例如:
$request = new FacebookRequest(
$session,
'POST',
'/me/photos',
array (
'source' => new CURLFile( $location.$name ),
)
);
CURLFile
only works on PHP 5.5+. CURLFile
仅适用于PHP 5.5+。 For earlier version of PHP, set source to: 对于早期版本的PHP,请将源设置为:
'source' => '@' . $location.$name
Assuming that the user has correctly uploaded the image and $location.$name
is the path: 假设用户已正确上传图像和
$location.$name
是路径:
$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: 另一个可能性是通过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. 上载之后由您执行的API调用由用户完成,但这仅是合乎逻辑的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.