2011-08-20 3 views
10

Tous les tutoriels que j'ai trouvés pour créer des albums Picasa et télécharger des images utilisent le Zend Framework que je n'ai pas étudié.Créer un album Picasa et télécharger des images avec PHP et cURL

Est-il possible de télécharger des images et de créer des albums en utilisant PHP et cURL?

Mes images sont stockées dans le répertoire e:/images et les informations d'image sont stockées dans une table MySQL comme ceci:

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 ; 

Je reçois le code d'authentification du client Google en utilisant le code suivant:

<?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' => '[email protected]', 
'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 
?> 

Quelqu'un peut-il donner des conseils sur la création d'un album nommé test et télécharger les images?

EDIT1:

Comment ajouter la licence de photo quand je télécharger des photos avec des scripts php?

référence 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 

Vérifiez les données de réponse de api obtenir album photo, il devrait y avoir quelque chose comme:

 "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" 
     }, 

Répondre

4

Voici un code pour la création de l'album. Nous reprendrons avec l'appel cURL pour s'authentifier.

//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); 

Charger une photo fonctionne de façon similaire:

http://code.google.com/apis/picasaweb/docs/2.0/developers_guide_protocol.html#PostPhotos

Voici le code qui fonctionne pour télécharger une image sans métadonnées:

$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); 

Et voici un exemple de télécharger une photo avec métadonnées (enfin!):

$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); 
+0

hey, ce sont quelques indications sur le site officiel, j'ai lu, mais sais toujours pas comment l'écrire dans le code php. une autre question, comment ajouter une licence photo lorsque je télécharge? Merci. –

+0

J'ai mis à jour avec du code pour la création d'album. Je posterai du code de téléchargement de photos si je peux comprendre cela. –

+0

OK, j'ai enfin du code de travail pour télécharger une image. Je suis toujours aux prises avec le téléchargement d'une image avec des métadonnées. –

1

L'expansion de la réponse de Mark, vous pouvez envoyer le XML directement à partir de boucles à l'aide CURLOPT_POSTFIELDS. Cependant, au lieu de faire un tableau associatif, essayez de transmettre la chaîne XML réelle comme ceci:

$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); 
Questions connexes