我正在尝试使用Graph API批量请求上传图片,但我无法使用内嵌图片上传,有人可以帮我吗?
批量请求文档:https://developers.facebook.com/docs/reference/api/batch/
照片批量上传:http://developers.facebook.com/blog/post/493/
照片批量上传博客文章代码工作正常,但我想从我的服务器而不是从我的电脑上传图像,例如:/public_html/image/pic.jpg我不知道我该怎么办。< / p>
编辑:我正在使用PHP SDK 3.0.1
这是我的代码:
<?php
CODE WAS CHANGED AND THE PROBLEM IS FIXED ALREADY, SEE THE ANSWER BELOW
?>
这是来自他们的文档:
上传二进制数据
二进制数据可以指定为multipart / mime部分的一部分 批处理API请求。批量Graph API允许上传多个 二进制项目作为批量调用的一部分。为了做到这一点,你需要 将所有二进制项添加为multipart / mime附件到您的 请求,并需要使用每个操作来引用其二进制项 操作中的“attached_files”属性。 “attachment_files” property可以在其中使用以逗号分隔的附件名称列表 值。
以下示例显示如何在一个批次中上传2张照片 拨打:
curl
–F ‘access_token=…’ \
-F ‘batch=[{“method”:”POST”, \
“relative_url”:”me/photos”, \
“body”:”message=My cat photo” \
"attached_files":"file1" \
},
{“method”:”POST”, \
“relative_url”:”me/photos”, \
“body”:”message=My dog photo” \
"attached_files":"file2" \
},
]’
-F ‘file1=@cat.gif’ \
-F 'file2=@dog.jpg' \
https://graph.facebook.com
编辑2:
答案 0 :(得分:8)
我看到的第一个问题是Batch不应该是URL的一部分,而是params的一部分......
请参阅下面的原油批次示例:
$batch = array();
$req = array(
'method' => 'GET',
'relative_url' => '/me'
);
$batch[] = json_encode($req);
$req = array(
'method' => 'GET',
'relative_url' => '/me/albums'
);
$batch[] = json_encode($req);
$params = array(
'batch' => '[' . implode(',',$batch) . ']'
);
try {
$info = $facebook->api('/','POST',$params);
} catch(FacebookApiException $e) {
error_log($e);
$info = null;
}
if(!empty($info)){
if($info[0]['code'] == '200'){
$user_profile = json_decode($info[0]['body']);
}
if($info[1]['code'] == '200'){
$user_albums = json_decode($info[1]['body']);
}
echo "<pre>User Profile:\n";
print_r($user_profile);
echo "\nAlbums\n";
print_r($user_albums);
echo "<pre>";
}
特别注意$ facebook-&gt; api调用是如何格式化的......
编辑:
这是一个工作批量图片上传:
$files = array(
'/data/Pictures/pic1.jpg',
'/data/Pictures/pic2.jpg',
'/data/Pictures/pic3.jpg'
);
//Must set upload support to true
$facebook->setFileUploadSupport(true);
$batch = array();
$params = array();
$count = 1;
foreach($files as $file){
$req = array(
'method' => 'POST',
'relative_url' => '/me/photos',
'attached_files' => 'file' . $count
);
//add this request to the batch ...
$batch[] = json_encode($req);
//set the filepath for the file to be uploaded
$params['file'.$count] = '@' . realpath($file);
$count++;
}
$params['batch'] = '[' . implode(',',$batch) . ']';
try{
$upload = $facebook->api('/','post',$params);
} catch(FacebookApiException $e) {
error_log($e);
$upload = null;
}
//View the results ...
if(!is_null($upload)){
echo "<pre>" . print_r($upload,1) . "<pre>";
echo "<hr />";
}
刚刚测试过它就像魅力......
答案 1 :(得分:0)
嗯,我不太确定,此刻我无法检查,但
http://au.php.net/manual/en/function.curl-setopt.php
在CURLOPT_POSTFIELDS上查一下,它说:
要在HTTP“POST”操作中发布的完整数据。 发布文件, 使用@前缀文件名并使用完整路径。文件类型可以是 通过跟随文件名中的类型明确指定 format'; type = mimetype'。此参数可以作为a传递 urlencoded字符串,如'para1 = val1&amp; para2 = val2&amp; ...'或作为数组 字段名称为键,字段数据为值。如果value是一个数组, Content-Type标头将设置为multipart / form-data。截至PHP 5.2.0,使用@前缀传递给该选项的文件必须采用数组形式才能工作。
这是另一个CURL示例:
所以你需要做的是
$queries = array(
array("method" => "POST", "relative_url" => "me/photos","body" => "message=cool","attached_files" => 'file1')
);
和
$batch = $facebook->api("/?batch=".json_encode($queries)."&file1=@pic.jpg", 'POST');
答案 2 :(得分:0)
// // File you want to upload/post
$post_data['file1'] = "@D:/home/2.jpg";
$post_data['file2'] = "@D:/home/1.jpg";
// Initialize cURL
$ch = curl_init();
// Set URL on which you want to post the Form and/or data
curl_setopt($ch, CURLOPT_URL, $post_url);
// Data+Files to be posted
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// Pass TRUE or 1 if you want to wait for and catch the response against the request made
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// For Debug mode; shows up any error encountered during the operation
curl_setopt($ch, CURLOPT_VERBOSE, 1);
// Execute the request
$response = curl_exec($ch);
// echo curl_errno($ch);
// echo curl_error($ch);
// Just for debug: to see response
echo $response;
这肯定会为我工作