2011-08-20 10 views
10

Todos los tutoriales que he encontrado para crear álbumes de Picasa y cargar imágenes utilizan el Zend Framework que no he estudiado.Crea un álbum de Picasa y sube imágenes a él con PHP y cURL

¿Es posible cargar imágenes y crear álbumes usando PHP y cURL?

Mis imágenes se almacenan en el directorio e:/images y la información de la imagen se almacena en una tabla de MySQL así:

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 ; 

Me estoy poniendo el código de autenticación de cliente de Google usando el siguiente código:

<?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 
?> 

¿Alguien puede dar alguna orientación sobre la creación de un álbum llamado test y subir las imágenes a la misma?

EDIT1:

Cómo agregar licencia foto cuando subo fotos con scripts php?

referencia sobre 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 

Comprobar los datos de respuesta de API álbum de fotos, no debería ser tener algo como:

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

Respuesta

4

Aquí hay algo de código para crear el álbum. Comenzaremos con la llamada cURL para autenticarse.

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

Cargar una foto funciona de manera similar:

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

aquí está funcionando código para subir una imagen sin metadatos:

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

Y aquí es un ejemplo de la posibilidad de subir una foto con metadatos (por fin!):

$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

bueno, estos son algunos de guía en el sitio oficial, he leído, pero todavía no sé cómo se escribe en código PHP. otra pregunta, ¿cómo agregar una licencia fotográfica cuando cargo? Gracias. –

+0

He actualizado el código para la creación del álbum. Voy a publicar un código de carga de fotos si puedo resolverlo. –

+0

OK, finalmente tengo un código de trabajo para subir una imagen. Todavía estoy luchando con subir una imagen con metadatos. –

1

Ampliación de la respuesta de la marca, puede enviar el código XML directamente de rizo usando CURLOPT_POSTFIELDS. Sin embargo, en vez de hacer un arreglo asociativo, trato pasando la cadena XML real de esta manera:

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