Я пытаюсь загрузить изображения, используя пакетный запрос Graph API, но я не могу загрузить с помощью встроенного изображения, может ли кто-нибудь мне помочь?
Документы пакетного запроса: https://developers.facebook.com/docs/reference/api/batch/
Загрузка фотокартинок: http://developers.facebook.com/blog/post/493/
Photo batch uploads blog post code работает отлично, но я хочу загружать изображения с моего сервера, а не с моего компьютера, Ex: /public_html/image/pic.jpg, и я не уверен, как я могу это сделать.
EDIT: я использую PHP SDK 3.0.1
Вот мой код:
<?php CODE WAS CHANGED AND THE PROBLEM IS FIXED ALREADY, SEE THE ANSWER BELOW ?>
Это из их документов:
Загрузка двоичных данных
Двоичные данные могут быть указаны как часть части multipart / mime запроса пакетного API. API-интерфейс пакетного графика позволяет загружать несколько двоичных элементов как часть пакетного вызова. Чтобы сделать это, вам нужно добавить все бинарные элементы в виде вложений multipart / mime в ваш запрос и потребовать, чтобы каждая операция ссылалась на его двоичные элементы, используя свойство «attach_files» в операции. Свойство «attach_files» может принимать разделенный запятыми список имен вложений.
В следующем примере показано, как загрузить 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
EDIT 2:
Первая проблема, которую я вижу, заключается в том, что пакет не должен быть частью URL-адреса, а скорее частью параметров …
См. Пример сырой партии:
$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-> 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 />"; }
Просто протестирован и работает как шарм …
Ну, я не слишком уверен, и я не могу проверить в данный момент, но
http://au.php.net/manual/en/function.curl-setopt.php
Посмотрите его на CURLOPT_POSTFIELDS, он говорит:
Полные данные для отправки в HTTP-режиме «POST». Чтобы опубликовать файл, добавьте имя файла с помощью @ и используйте полный путь. Тип файла может быть явно указан, следуя имени файла с типом в формате '; type = mimetype'. Этот параметр может быть передан как строка с urlencoded, например 'para1 = val1 & para2 = val2 & …', или как массив с именем поля в качестве ключа и данными поля в качестве значения. Если значением является массив, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0, файлы, переданные этому параметру с префиксом @, должны быть в форме массива для работы.
Вот еще один пример CURL:
CURL PHP отправить изображение
Итак, что вам нужно сделать, это
$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');
// // 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;
Это будет работать, чтобы убедиться, что он работает для меня