Все учебники, которые я нашел для создания альбомов Picasa и загрузки изображений, используют Zend Framework, которые я не изучал.
Можно ли загружать изображения и создавать альбомы с помощью PHP и cURL?
Мои изображения хранятся в каталоге e:/images
а информация об изображении хранится в таблице MySQL следующим образом:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; CREATE TABLE IF NOT EXISTS `picasaimage` ( `id` bigint(1) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `content` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `tags` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `license` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `image_path` varchar(150) COLLATE utf8_unicode_ci NOT NULL, `width` int(4) COLLATE utf8_unicode_ci NOT NULL, `height` int(4) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;
Я получаю код проверки подлинности клиента Google, используя следующий код:
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $data = array('accountType' => 'GOOGLE', 'Email' => 'youremailaddress@gmail.com', 'Passwd' => 'yourpassword', 'source'=>'PHI-cUrl-Example', 'service'=>'lh2'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $hasil = curl_exec($ch); echo $hasil; //SID=DQA...oUE //LSID=DQA...bbo //Auth=DQA...Sxq ?>
Может ли кто-нибудь дать некоторые рекомендации по созданию альбома с именем test
и загрузке изображений на него?
EDIT1:
Как добавить лицензию на фотографии при загрузке фотографий с помощью php-скриптов?
ссылка на http://commons.wikimedia.org/wiki/Commons:Picasa_Web_Albums_files
Creative Commons Attribution 3.0 Unported (CC-BY) Creative Commons Attribution-Share Alike 3.0 Unported Unlicensed Creative Commons Attribution-Noncommercial 3.0 Unported Creative Commons Attribution-No Derivative Works 3.0 Unported Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported
Проверьте данные ответа от api get album photo, должно быть что-то вроде:
"gphoto$license":{ "$t":"ATTRIBUTION_NON_COMMERCIAL_NO_DERIVATIVES", "id":3, "name":"Attribution-Noncommercial-No Derivative", "url":"http://creativecommons.org/licenses/by-nc-nd/3.0" },
Вот какой код для создания альбома. Мы получим вызов cURL для аутентификации.
//This is the cURL call to authenticate. We'll splitting out the return values //to more easily get the auth code. $ret = explode("\n",curl_exec($ch)); //Save all of the return values to an array so we can get them more easily later $gvals = array(); foreach($ret as $item) { $flds = explode("=", $item); if(count($flds) > 1) { $gvals[$flds[0]] = $flds[1]; } } //This is the authentication header we'll need to pass with each successive call $authHeader = 'Authorization: GoogleLogin auth="' . $gvals['Auth'] . '"'; $userId = "THE PICASA USER ID GOES HERE"; $feedUrl = "https://picasaweb.google.com/data/feed/api/user/$userId"; //This is the XML for creating a new album. $rawXml = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gphoto='http://schemas.google.com/photos/2007'> <title type='text'>Test album from PHP</title> <summary type='text'>This is a test album</summary> <gphoto:location>Louisville</gphoto:location> <gphoto:access>public</gphoto:access> <gphoto:timestamp>1152255600000</gphoto:timestamp> <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#album'></category> </entry>"; //Setup our cURL options //Notice the last one where we pass in the authentication header $options = array( CURLOPT_URL=> $feedUrl, CURLOPT_SSL_VERIFYPEER=> false, CURLOPT_POST=> true, CURLOPT_RETURNTRANSFER=> true, CURLOPT_HEADER=> true, CURLOPT_FOLLOWLOCATION=> true, CURLOPT_POSTFIELDS=> $rawXml, CURLOPT_HTTPHEADER=> array('GData-Version: 2', $authHeader, 'Content-Type: application/atom+xml') ); curl_setopt_array($ch, $options); //This call will create the Picasa album. //The return value is XML with a bunch of information about the newly created album. $ret = curl_exec($ch);
Загрузка фотографии работает так же:
http://code.google.com/apis/picasaweb/docs/2.0/developers_guide_protocol.html#PostPhotos
Вот действующий код для загрузки изображения без метаданных:
$userId = "USER ID GOES HERE"; $albumId = "ALBUM ID GOES HERE"; $albumUrl = "https://picasaweb.google.com/data/feed/api/user/$userId/albumid/$albumId"; $imgName = $_SERVER['DOCUMENT_ROOT'] . '/picasa/cute_baby_kitten.jpg'; //Get the binary image data $fileSize = filesize($imgName); $fh = fopen($imgName, 'rb'); $imgData = fread($fh, $fileSize); fclose($fh); $header = array('GData-Version: 2', $authHeader, 'Content-Type: image/jpeg', 'Content-Length: ' . $fileSize, 'Slug: cute_baby_kitten.jpg'); $data = $imgData; //Make sure the image data is NOT Base64 encoded otherwise the upload will fail with a "Not an image" error $ret = ""; $ch = curl_init($albumUrl); $options = array( CURLOPT_SSL_VERIFYPEER=> false, CURLOPT_POST=> true, CURLOPT_RETURNTRANSFER=> true, CURLOPT_HEADER=> true, CURLOPT_FOLLOWLOCATION=> true, CURLOPT_POSTFIELDS=> $data, CURLOPT_HTTPHEADER=> $header ); curl_setopt_array($ch, $options); $ret = curl_exec($ch); curl_close($ch);
И вот пример загрузки фотографии с метаданными (наконец!):
$albumUrl = "https://picasaweb.google.com/data/feed/api/user/$userId/albumid/$albumId"; $imgName = $_SERVER['DOCUMENT_ROOT'] . '/picasa/cute_baby_kitten.jpg'; $rawImgXml = '<entry xmlns="http://www.w3.org/2005/Atom"> <title>plz-to-love-realcat.jpg</title> <summary>Real cat wants attention too.</summary> <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/photos/2007#photo"/> </entry>'; $fileSize = filesize($imgName); $fh = fopen($imgName, 'rb'); $imgData = fread($fh, $fileSize); fclose($fh); $dataLength = strlen($rawImgXml) + $fileSize; $data = ""; $data .= "\nMedia multipart posting\n"; $data .= "--P4CpLdIHZpYqNn7\n"; $data .= "Content-Type: application/atom+xml\n\n"; $data .= $rawImgXml . "\n"; $data .= "--P4CpLdIHZpYqNn7\n"; $data .= "Content-Type: image/jpeg\n\n"; $data .= $imgData . "\n"; $data .= "--P4CpLdIHZpYqNn7--"; $header = array('GData-Version: 2', $authHeader, 'Content-Type: multipart/related; boundary=P4CpLdIHZpYqNn7;', 'Content-Length: ' . strlen($data), 'MIME-version: 1.0'); $ret = ""; $ch = curl_init($albumUrl); $options = array( CURLOPT_SSL_VERIFYPEER=> false, CURLOPT_POST=> true, CURLOPT_RETURNTRANSFER=> true, CURLOPT_HEADER=> true, CURLOPT_FOLLOWLOCATION=> true, CURLOPT_POSTFIELDS=> $data, CURLOPT_HTTPHEADER=> $header ); curl_setopt_array($ch, $options); $ret = curl_exec($ch); curl_close($ch);
Развернув ответ Марка, вы можете отправить XML непосредственно из curl, используя CURLOPT_POSTFIELDS . Однако вместо создания ассоциативного массива попробуйте передать фактическую строку XML так:
$data= "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gphoto='http://schemas.google.com/photos/2007'> <title type='text'>Trip To Italy</title> <summary type='text'>This was the recent trip I took to Italy.</summary> <gphoto:location>Italy</gphoto:location> <gphoto:access>public</gphoto:access> <gphoto:timestamp>1152255600000</gphoto:timestamp> <media:group> <media:keywords>italy, vacation</media:keywords> </media:group> <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#album'></category> </entry>"; curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $hasil = curl_exec($ch);