picasa csdn_使用Picasa网络相册开发PHP应用程序

picasa csdn

作为需要拍摄大量数码照片的人,我对磁盘混乱并不陌生-我的计算机上有数百兆的旧照片,其中大多数带有粗略或不存在的标签。 就在几个月前,当我终于试用了Google的免费Picasa照片管理软件时,疯狂的想法开始浮出水面。

但是Picasa不仅仅是您可以从网上下载的工具,它还作为免费的照片共享网站Picasa网络相册在线存在于网上。 在该网站上,用户可以上传照片和视频,将它们分类为相册,为它们添加关键字以方便搜索,以及与他人共享。 不过,最好的部分是在幕后:与其他许多Google工具一样,Picasa网络相册公开了Data API,该API可让开发人员围绕用户相册中存储的图像构建自定义的应用程序。 您可以通过任何具有XML功能的开发工具包访问遵循REST模型的该API。 该API已经具有许多常见编程语言的客户端库...包括我最常用的一种PHP。

本文将向您介绍Google Picasa网络相册数据API,并向您展示如何通过PHP应用程序集成和使用Picasa相册和照片。 其示例包括如何检索相册和照片,如何通过自定义的Web界面上传照片以及如何通过关键字搜索照片。 因此,快来开始吧!

了解Picasa网络相册数据API

在深入研究PHP代码之前,请先对Picasa网络相册数据API进行一些说明。 与所有基于REST的服务一样,事情始于对指定资源的HTTP请求。 此HTTP请求包含具有一个或多个输入参数的查询。 服务器使用适合于在任何支持XML的客户端中解析的Atom或RSS格式的响应(或提要)回复查询。

典型的Picasa Feed中包含很多信息。 要查看示例,请尝试将URL http://picasaweb.google.com/data/feed/api/user/ userid ?kind = photo弹出到Web浏览器中(用您的Google帐户用户名替换userid之后),并假设您已经在Picasa网络相册中保存了一些照片和相册,您应该会看到类似于清单1的内容

快速浏览一下此输出,以熟悉其主要元素:

  • Picasa网络相册数据API响应REST请求并提供请求的数据供稿。 提供各种供稿:相册供稿,照片供稿,用户供稿,用户联系人供稿等。 因此,在大多数情况下,XML响应包含一个<feed>元素作为根元素。 <feed>元素包含<link>元素和<openSearch:>元素,其中<link>元素包含结果集的当前,下一页和前一页的URL,而<openSearch:>元素包含搜索的摘要统计信息。
  • 最外面的<feed>元素包含一个或多个<entry>元素,每个元素代表与查询匹配的照片。 每个<entry>都包含有关其代表的照片的更多信息,包括标题,文件名,出版日期和作者。 每个<entry>还包含<link>元素,这些元素提供URL链接以查看和编辑照片。
  • 每个<entry>中的一组<gphoto:>元素包含有关照片的详细信息:其大小,尺寸,相册,评论数等。
  • 每个<entry>中的<media:group>元素包含照片关键字和缩略图链接。

使用SimpleXML检索照片

现在,您将继续使用PHP和SimpleXML解析Picasa网络相册供稿的示例。 清单2摘自清单1的提要,并使用SimpleXML从中提取相关的数据片段并将其格式化为Web页面:

清单2:使用SimpleXML检索照片清单
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing album contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    img {
      float: left;  
    }
    </style>    
  </head>
  <body>
    <?php
    $userid = 'userid%40googlemail.com';

    // build feed URL
    $feedURL = "http://picasaweb.google.com/data/feed/api/user/$userid?kind=photo";
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get album name and number of photos
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> photo(s) found.
    <p/>

    <?php    
    // iterate over entries in album
    // print each entry's title, size, dimensions, tags, and thumbnail image
    foreach ($sxml->entry as $entry) {
      $title = $entry->title;
      $summary = $entry->summary;
      
      $gphoto = $entry->children('http://schemas.google.com/photos/2007');
      $size = $gphoto->size;
      $height = $gphoto->height;
      $width = $gphoto->width;
      
      $media = $entry->children('http://search.yahoo.com/mrss/');
      $thumbnail = $media->group->thumbnail[1];
      $tags = $media->group->keywords;
      
      echo "<h2>$summary</h2>\n";
      echo "<table><tr><td><img src=\"" . 
      $thumbnail->attributes()->{'url'} . "\"/></td>\n";
      echo "<td><span class=\"attr\">File</span>: $title 
      <br />\n";
      echo "<span class=\"attr\">Size</span>: $size bytes 
      ($height x $width) <br />\n";
      echo "<span class=\"attr\">Tags</span>: $tags 
      </td></tr></table>\n";
    }
    ?>
    
  </body>
</html>

图1展示了您可能看到的输出:

图1.列出照片的网页
列出照片的网页

清单2首先使用simplexml_load_file()对象向提要URL发送请求,并将响应转换为SimpleXML对象。 然后,它遍历响应中的<entry>元素,使用foreach()循环处理每个元素,并检索图1所示的信息。 每个<entry>下的子节点都表示为SimpleXML对象属性-例如,<title>节点由$ entry-> title表示,<summary>节点由$ entry-> summary表示,依此类推。 关键字和缩略图图像是从每个<entry>下的<media:group>元素获取的。

使用用户和相册供稿

如果要获取特定用户创建的所有专辑的列表,也可以轻松地对其进行管理。 您使用清单2中的feed URL,但是更改了kind参数以列出相册而不是照片。 清单3演示了如何获取和解析这样的提要:

清单3:使用SimpleXML检索专辑列表
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing albums</title>
    <style>
    body {
      font-family: Verdana;      
    }
    </style>    
  </head>
  <body>
    <h1>Album Listing</h2>
    <?php
    $userid = 'userid%40googlemail.com';
    
    // build feed URL
    $feedURL = "http://picasaweb.google.com/data/feed/api/user/$userid?kind=album";
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get album names and number of photos in each
    echo "<ul>";
    foreach ($sxml->entry as $entry) {      
      $title = $entry->title;
      $gphoto = $entry->children('http://schemas.google.com/photos/2007');
      $numphotos = $gphoto->numphotos;      
      echo "<li>$title - $numphotos photo(s)</li>\n";
    }
    echo "</ul>";
    ?>
    
  </body>
</html>

图2展示了修改后的输出:

图2.列出相册的网页
列出相册的网页

要获取仅列出特定相册中照片的相册供稿,请在供稿URL中指定相册名称。 清单4演示了如何获取和解析这样的提要:

清单4:使用SimpleXML检索相册中的照片
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing album contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    img {
      float: left;  
    }
    </style>    
  </head>
  <body>
    <?php
    $userid = 'userid%40googlemail.com';
    $album = 'France2008';
    
    // build feed URL
    $feedURL = "http://picasaweb.google.com/data/feed/api/user/$userid/album/$album";
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get album name and number of photos
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> photo(s) found.
    <p/>

    <?php    
    // iterate over entries in album
    // print each entry's title, size, dimensions, tags, and thumbnail image
    foreach ($sxml->entry as $entry) {
      $title = $entry->title;
      $summary = $entry->summary;
      
      $gphoto = $entry->children('http://schemas.google.com/photos/2007');
      $size = $gphoto->size;
      $height = $gphoto->height;
      $width = $gphoto->width;
      
      $media = $entry->children('http://search.yahoo.com/mrss/');
      $thumbnail = $media->group->thumbnail[1];
      $tags = $media->group->keywords;
      
      echo "<h2>$summary</h2>\n";
      echo "<table><tr><td><img src=\"" . 
      $thumbnail->attributes()->{'url'} . "\"/></td>\n";
      echo "<td><span class=\"attr\">File</span>: $title 
      <br />\n";
      echo "<span class=\"attr\">Size</span>: $size bytes 
      ($height x $width) <br />\n";
      echo "<span class=\"attr\">Tags</span>: $tags 
      </td></tr></table>\n";
    }
    ?>
    
  </body>
</html>

图3演示了输出结果:

图3.列出相册中照片的网页
列出相册中照片的网页

使用Zend GData客户端库检索照片

前面的示例说明了使用PHP从Picasa网络相册中读取和使用数据非常容易。 但是,只读访问有其局限性。 要执行需要写访问权限的更复杂的操作(例如添加新照片或相册),您需要使用两种Google批准的身份验证方法之一(AuthSub或ClientLogin)向应用程序添加用户身份验证。

手动执行这种类型的身份验证是一件非常麻烦的事情,并且需要大量的代码来说明在典型的身份验证事务期间可能出现的各种情况。 幸运的是,您不必为此担心太多:Zend的GData客户端库专为尝试将PHP应用程序与Google Data API集成的开发人员而设计,可以为您处理所有详细信息。 您可以单独下载该库(请参阅参考资料中的链接),它提供了一个方便的,面向对象的Google Data API界面,并封装了大多数常见任务(包括身份验证),因此您可以自由地专注于核心您的应用程序的功能。

清单5通过使用Zend GData Client Library复制清单4的功能进行演示:

清单5:使用Zend GData客户端库检索相册中的照片
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing album contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    img {
      float: left;  
    }
    </style>    
  </head>
  <body>
    <?php
    // load library
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
    Zend_Loader::loadClass('Zend_Gdata_Photos');
    Zend_Loader::loadClass('Zend_Http_Client');
    
    // create authenticated HTTP client for Picasa service
    $svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
    $user = "userid@gmail.com";
    $pass = "secret";
    $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
    $gphoto = new Zend_Gdata_Photos($client);
    
    // generate query to get album feed
    $query = $gphoto->newAlbumQuery();    
    $query->setUser("default");
    $query->setAlbumName("France2008");
    
    // get and parse album feed
    // get album name and number of photos
    try {
      $feed = $gphoto->getAlbumFeed($query);
    } catch (Zend_Gdata_App_Exception $e) {
      echo "Error: " . $e->getResponse();
    }
    ?>
    <h1><?php echo $feed->getTitle(); ?></h1>
    <?php echo $feed->getTotalResults(); ?> photo(s) found.
    <p/>

    <?php        
    // process each photo entry
    // print each entry's title, size, dimensions, tags, and thumbnail image
    foreach ($feed as $entry) {
      $title = $entry->getTitle();
      $summary = $entry->getSummary();
      $thumbnail = $entry->getMediaGroup()->getThumbnail();
      $tags = $entry->getMediaGroup()->getKeywords();
      $size = $entry->getGphotoSize();
      $height = $entry->getGphotoHeight();
      $width = $entry->getGphotoWidth();
      
      echo "<h2>$summary</h2>\n";
      echo "<table><tr><td><img src=\"" . 
      $thumbnail[1]->url . "\"/></td>\n";
      echo "<td><span class=\"attr\">File</span>: $title 
      <br />\n";
      echo "<span class=\"attr\">Size</span>: $size bytes 
      ($height x $width) <br />\n";
      echo "<span class=\"attr\">Tags</span>: $tags 
      </td></tr></table>\n";
    }
    ?>

  </body>
</html>

清单5首先加载Zend类库,然后初始化Zend_Http_Client类的实例。 该客户端将获得必要的用户身份验证信息,并打开与Picasa服务的身份验证连接。 打开经过身份验证的连接后,将使用getAlbumFeed()方法检索相册供稿。 此方法接受一个AlbumQuery对象,该对象配置了两个参数:

  • 所有者的Picasa用户名
  • 专辑名称

getAlbumFeed() API调用的响应是一个类似于清单1的XML提要,然后将其解析并转换为PHP对象。 该对象公开了getter和setter魔术方法,使通过对象/属性表示法从XML提要中的节点检索特定信息变得容易。 因此,例如, getSummary()方法检索照片摘要,而getGphotoSize()方法检索照片大小(以字节为单位)。

图4展示了您可能看到的输出:

图4.列出相册中照片的网页
列出相册中照片的网页

添加新照片

现在您可以列出照片了,添加新照片怎么样? 实际上,这并不像看起来那样复杂。

要添加新照片,只需将图像文件以及相关的元数据作为MIME编码的块发布到相册的提要URL中。 块的一部分应包含XML编码的<entry>; 另一种是二进制数据。 清单6给出了一个这样的块的示例:

清单6:用于添加带有元数据的新照片的示例POST数据包
--=_00fb9c5957c74e05312cbc2f9d1d09b8
Content-Type: application/atom+xml
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom">
  <atom:category term="http://schemas.google.com/photos/2007#photo" 
  scheme="http://schemas.google.com/g/2005#kind"/>
  <atom:summary type="text">Notre Dame, Paris</atom:summary>
  <media:group xmlns:media="http://search.yahoo.com/mrss/">
    <media:keywords>church, paris</media:keywords>
  </media:group>
</atom:entry>

--=_00fb9c5957c74e05312cbc2f9d1d09b8
Content-Type: image/jpeg

[binary data]

如果您使用Zend库,事情将变得更加简单。 您只需要调用insertPhotoEntry()方法即可在清单6中创建POST数据包,然后将其发布到相册供稿中。 清单7演示了如何构建一个Web表单,该表单向用户询问照片文件,标题和标签,然后使用Zend库构造相应的POST数据包并将数据保存到相册中:

清单7:添加新照片
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Adding photos to an album</title>
    <style>
    body {
      font-family: Verdana;      
    }
    li {
      border-bottom: solid black 1px;      
      margin: 10px; 
      padding: 2px; 
      width: auto;
      padding-bottom: 20px;
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    </style>    
  </head>
  <body>
    <h1>Add Photo</h1>
    <?php if (!isset($_POST['submit'])) { ?>
    <form method="post" action="<?php 
     echo htmlentities($_SERVER['PHP_SELF']); ?>" enctype="multipart/form-data">
      Title: <br/>
      <input name="title" type="text" size="25" /><p/>
      File to upload: <br/>
      <input name="photofile" type="file" /><p/>      
      Tags: <br/>
      <input name="tags" type="text" size="25" /><p/>
      <input name="submit" type="submit" value="Save" />
    </form>
    <?php
    } else {
      // load classes
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Gdata');
      Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
      Zend_Loader::loadClass('Zend_Gdata_Photos');
      Zend_Loader::loadClass('Zend_Http_Client');
      
      // connect to service
      $svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
      $user = "userid@gmail.com";
      $pass = "secret";
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
      $gphoto = new Zend_Gdata_Photos($client);
      
      // validate input
      if (empty($_POST['title'])) {
        die('ERROR: Missing title');
      } 
      
      // sanitize input
      $title = htmlentities($_POST['title']);
      $tags = htmlentities($_POST['tags']);

      // set album name
      $albumName = "France2008";

      // construct photo object
      // save to server      
      try {        
        $photo = $gphoto->newPhotoEntry();
        
        // set file
        $file = $gphoto->newMediaFileSource($_FILES['photofile']['tmp_name']);
        $file->setContentType("image/jpeg");
        $photo->setMediaSource($file);
        
        // set title
        $photo->setSummary($gphoto->newSummary($title));
        
        // set tags
        $photo->mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup();
        $keywords = new Zend_Gdata_Media_Extension_MediaKeywords();
        $keywords->setText($tags);
        $photo->mediaGroup->keywords = $keywords;
        
        // link to album
        $album = $gphoto->newAlbumQuery();        
        $album->setUser($user);
        $album->setAlbumName($albumName);
        
        // save photo
        $gphoto->insertPhotoEntry($photo, $album->getQueryUrl()); 
      } catch (Zend_Gdata_App_Exception $e) {
        echo "Error: " . $e->getResponse();
      }
      echo 'Photo successfully added!';      
    }
    ?>
  </body>
</html>

清单7实际上由两部分组成:

  • 网络表格
  • PHP代码,用于处理通过表单提交的输入

图5展示了这种形式的样子:

图5.添加新照片的Web表单
Web表单以添加新照片

一旦用户选择了要上传的图像文件,并在此表单中输入标题和可选标签并提交,脚本的后半部分就会生效。 首先,初始化HTTP客户端并打开与Picasa网络相册数据API的身份验证连接。 接下来,验证输入到Web表单中的输入,并初始化一个新的PhotoEntry()对象,以保存新照片的数据。

输入到表单中的关键字和标题分别通过其mediaGroup属性和setSummary()方法附加到此对象。 PHP中的特殊文件上载数组$_FILES获得上载文件的文件名,并且setMediaSource()方法将此文件附加到对象。 最后, setAlbumName()方法指定照片链接到的相册(将相册值设置为default,以将图像放置在默认相册或放置框中 )。

配置insertPhotoEntry()这些各种对象参数后, insertPhotoEntry()方法实际上会将照片和元数据保存到Google服务器。 添加照片后,您应该立即在相应的相册中看到它。

图6说明了成功添加新照片后的输出:

图6.添加新照片的结果
添加新照片的结果

删除和修改照片

要删除照片,请将DELETE请求发送到照片的唯一URL。 在Zend库上下文中,您使用照片和相册ID构造照片URL,使用getPhotoEntry()方法获取对照片的引用(作为对象),然后调用该对象的delete()方法。 清单8演示了该过程:

清单8:删除照片
<?php
// load classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Photos');
Zend_Loader::loadClass('Zend_Http_Client');

// connect to service
$svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
$user = "userid@gmail.com";
$pass = "secret";
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
$gphoto = new Zend_Gdata_Photos($client);

// get photo entry
// delete entry
try {
  $photo = $gphoto->getPhotoEntry( 'http://picasaweb.google.com/data/entry/api/
  user/xxxxx/albumid/yyyyy/photoid/zzzzz');
  $photo->delete();
} catch (Zend_Gdata_App_Exception $e) {
  echo "Error: " . $e->getResponse();
}        
echo 'Photo successfully deleted!';  
?>

要编辑照片,请再次使用getPhotoEntry()方法。 这次,为各种对象属性设置新值,然后调用对象的save()方法以将更改保存回服务器。 清单9演示了该过程:

清单9:更新照片
<?php
// load classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Photos');
Zend_Loader::loadClass('Zend_Http_Client');

// connect to service
$svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
$user = "userid@gmail.com";
$pass = "secret";
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
$gphoto = new Zend_Gdata_Photos($client);

// get photo entry
// delete entry
try {
  $photo = $gphoto->getPhotoEntry('http://picasaweb.google.com/
  data/entry/api/user/xxxxx/albumid/yyyyy/photoid/zzzzz');

  // set new title
  $photo->setSummary($gphoto->newSummary('New title'));
  
  // set new tags
  $photo->mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup();
  $keywords = new Zend_Gdata_Media_Extension_MediaKeywords();
  $keywords->setText('new,tags');
  $photo->mediaGroup->keywords = $keywords;
  
  $photo->save();
} catch (Zend_Gdata_App_Exception $e) {
  echo "Error: " . $e->getResponse();
}        
echo 'Photo successfully modified!';  
?>

过滤Feed结果

通过Picasa网络相册数据API,您还可以自定义供稿。 您可以限制摘要中的条目数,或者仅检索那些符合搜索条件的条目。 例如,如清单10所示,如果将'max-results'参数添加到feed URL,则可以限制feed响应中返回的条目数:

清单10:限制提要结果
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Restricting feed results</title>
    <style>
    body {
      font-family: Verdana;      
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    img {
      float: left;  
    }
    </style>    
  </head>
  <body>
    <?php
    $userid = 'userid%40googlemail.com';
    $album = 'France2008';
    
    // build feed URL
    $feedURL = "http://picasaweb.google.com/data/feed/api/
    user/$userid/album/$album?max-results=3";
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get album name and number of photos
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> photo(s) found.
    <p/>

    <?php    
    // iterate over entries in album
    // print each entry's title, size, dimensions, tags, and thumbnail image
    foreach ($sxml->entry as $entry) {
      $title = $entry->title;
      $summary = $entry->summary;
      
      $gphoto = $entry->children('http://schemas.google.com/photos/2007');
      $size = $gphoto->size;
      $height = $gphoto->height;
      $width = $gphoto->width;
      
      $media = $entry->children('http://search.yahoo.com/mrss/');
      $thumbnail = $media->group->thumbnail[1];
      $tags = $media->group->keywords;
      
      echo "<h2>$summary</h2>\n";
      echo "<table><tr><td><img src=\"" . 
      $thumbnail->attributes()->{'url'} . "\"/></td>\n";
      echo "<td><span class=\"attr\">File</span>: $title 
      <br />\n";
      echo "<span class=\"attr\">Size</span>: $size 
      ($height x $width) <br />\n";
      echo "<span class=\"attr\">Tags</span>: $tags 
      </td></tr></table>\n";
    }
    ?>
    
  </body>
</html>

另外,使用q参数时,您只能检索与特定查询字符串匹配的那些条目。 Picasa将搜索每张照片的标题,标题和标签,以查找与查询字符串匹配的内容。 清单11通过显示所有带有标签“ church”的照片来说明:

清单11:按关键字搜索照片
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Searching photos by tag</title>
    <style>
    body {
      font-family: Verdana;      
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    img {
      float: left;  
    }
    </style>    
  </head>
  <body>
    <?php
    $userid = 'userid%40googlemail.com';
    $album = 'France2008';
    
    // build feed URL
    $feedURL = "http://picasaweb.google.com/data/feed/api/user/
    $userid/album/$album?tag=church";
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get album name and number of photos
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> photo(s) found.
    <p/>

    <?php    
    // iterate over entries in album
    // print each entry's title, size, dimensions, tags and thumbnail image
    foreach ($sxml->entry as $entry) {
      $title = $entry->title;
      $summary = $entry->summary;
      
      $gphoto = $entry->children('http://schemas.google.com/photos/2007');
      $size = $gphoto->size;
      $height = $gphoto->height;
      $width = $gphoto->width;
      
      $media = $entry->children('http://search.yahoo.com/mrss/');
      $thumbnail = $media->group->thumbnail[1];
      $tags = $media->group->keywords;
      
      echo "<h2>$summary</h2>\n";
      echo "<table><tr><td><img src=\"" . 
      $thumbnail->attributes()->{'url'} . "\"/></td>\n";
      echo "<td><span class=\"attr\">File</span>: $title 
      <br />\n";
      echo "<span class=\"attr\">Size</span>: $size 
      ($height x $width) <br />\n";
      echo "<span class=\"attr\">Tags</span>: $tags 
      </td></tr></table>\n";
    }
    ?>
    
  </body>
</html>

图7展示了可能的输出:

图7.通过关键字搜索照片
通过关键字搜索照片

整合Picasa动作

您已经准备好将所有这些信息投入实际使用,并构建一个基于PHP的简单应用程序,使您可以查看,删除,添加和搜索给定相册中的照片,并附带Picasa提供的功能网络相册数据API。 该原型应用程序具有3个脚本(请参见下载 ):

  • 'list.php'-列出相册中的照片,并提供搜索,添加和删除照片的链接
  • 'add.php'-显示一个表单以添加新照片并处理提交
  • 'delete.php'-删除指定的照片

从“ list.php”( 清单12 )开始,它将更新清单4,以便每张照片现在都带有一个删除链接。 该页面还包含其他搜索表单:

清单12:列出照片
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing album contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    img {
      float: left;  
    }
    </style>    
  </head>
  <body>
    <?php
    // load library
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
    Zend_Loader::loadClass('Zend_Gdata_Photos');
    Zend_Loader::loadClass('Zend_Http_Client');
    
    // create authenticated HTTP client for Picasa service
    $svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
    $user = "userid@gmail.com";
    $pass = "secret";
    $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
    $gphoto = new Zend_Gdata_Photos($client);
    
    // generate query to get album feed
    $query = $gphoto->newAlbumQuery();    
    $query->setUser("default");
    $query->setAlbumName("France2008");
    
    // filter by search term
    if(isset($_GET['q'])) {
      $query->setQuery($_GET['q']);      
    }
    
    // get and parse album feed
    // get album name and number of photos
    try {
      $feed = $gphoto->getAlbumFeed($query);
    } catch (Zend_Gdata_App_Exception $e) {
      echo "Error: " . $e->getResponse();
    }
    ?>
    <h1><?php echo $feed->getTitle(); ?></h1>
    <?php echo $feed->getTotalResults(); ?> photo(s) found.
    <p/>

    <?php        
    // process each photo entry
    // print each entry's title, size, dimensions, tags, and thumbnail image
    foreach ($feed as $entry) {
      $title = $entry->getTitle();
      $summary = $entry->getSummary();
      $thumbnail = $entry->getMediaGroup()->getThumbnail();
      $tags = $entry->getMediaGroup()->getKeywords();
      $size = $entry->getGphotoSize();
      $height = $entry->getGphotoHeight();
      $width = $entry->getGphotoWidth();
      $photoid = $entry->getGphotoId();
      $albumid = $entry->getGphotoAlbumId();
      
      echo "<h2>$summary</h2>\n";
      echo "<table><tr><td><img src=\"" . 
      $thumbnail[1]->url . "\"/></td>\n";
      echo "<td><span class=\"attr\">File</span>: $title 
      <br />\n";
      echo "<span class=\"attr\">Size</span>: $size bytes 
      ($height x $width) <br />\n";
      echo "<span class=\"attr\">Tags</span>: $tags 
      <br />\n";
      echo "<a href=\"delete.php?aid=$albumid&pid=$photoid\">
       delete photo</a></td></tr></table>\n";
    }
    ?>
    
    <a href="add.php">Add a new photo</a>
    <p/>
    
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
      Search for photos containing:<br/>
      <input type="text" name="q" size="10"/><p/>
      <input type="submit" name="submit" value="Search"/>
    </form>

  </body>
</html>

图8说明了运行此脚本后可能看到的内容:

图8.列出相册中照片的网页
列出相册中照片的网页

清单12中注意到,搜索表单提交后,只需重新调用list.php,并通过查询对象的setQuery()方法将用户的查询字符串附加到请求的提要上。

add.php脚本添加新照片,如清单13所示

清单13:添加照片
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Adding photos to an album</title>
    <style>
    body {
      font-family: Verdana;      
    }
    li {
      border-bottom: solid black 1px;      
      margin: 10px; 
      padding: 2px; 
      width: auto;
      padding-bottom: 20px;
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    </style>    
  </head>
  <body>
    <h1>Add Photo</h1>
    <?php if (!isset($_POST['submit'])) { ?>
    <form method="post" action="<?php 
    echo htmlentities($_SERVER['PHP_SELF']); ?>" enctype="multipart/form-data">
      Title: <br/>
      <input name="title" type="text" size="25" /><p/>
      File to upload: <br/>
      <input name="photofile" type="file" /><p/>      
      Tags: <br/>
      <input name="tags" type="text" size="25" /><p/>
      <input name="submit" type="submit" value="Save" />
    </form>
    <?php
    } else {
      // load classes
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Gdata');
      Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
      Zend_Loader::loadClass('Zend_Gdata_Photos');
      Zend_Loader::loadClass('Zend_Http_Client');
      
      // connect to service
      $svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
      $user = "userid@gmail.com";
      $pass = "secret";
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
      $gphoto = new Zend_Gdata_Photos($client);
      
      // validate input
      if (empty($_POST['title'])) {
        die('ERROR: Missing title');
      } 
      
      // sanitize input
      $title = htmlentities($_POST['title']);
      $tags = htmlentities($_POST['tags']);

      // set album name
      $albumName = "France2008";

      // construct photo object
      // save to server      
      try {        
        $photo = $gphoto->newPhotoEntry();
        
        // set file
        $file = $gphoto->newMediaFileSource($_FILES['photofile']['tmp_name']);
        $file->setContentType("image/jpeg");
        $photo->setMediaSource($file);
        
        // set title
        $photo->setSummary($gphoto->newSummary($title));
        
        // set tags
        $photo->mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup();
        $keywords = new Zend_Gdata_Media_Extension_MediaKeywords();
        $keywords->setText($tags);
        $photo->mediaGroup->keywords = $keywords;
        
        // link to album
        $album = $gphoto->newAlbumQuery();        
        $album->setUser($user);
        $album->setAlbumName($albumName);
        
        // save photo
        $gphoto->insertPhotoEntry($photo, $album->getQueryUrl()); 
      } catch (Zend_Gdata_App_Exception $e) {
        echo "Error: " . $e->getResponse();
      }
      echo 'Photo successfully added!';      
    }
    ?>
  </body>
</html>

图9演示了这种形式:

图9.添加新照片的Web表单
用于添加新照片的Web表单

您可以使用delete.php脚本删除照片,该脚本使用GET方法从list.php接受唯一的相册和照片ID。 delete.php脚本使用此信息来查找和删除照片条目。 清单14显示了代码:

清单14:删除照片
<?php
// check for album and photo ID 
if (empty($_GET['aid']) || empty($_GET['pid'])) {
  die('ERROR: Missing input parameters');
} else{
  $aid = htmlentities($_GET['aid']);  
  $pid = htmlentities($_GET['pid']);  
}

// load classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Photos');
Zend_Loader::loadClass('Zend_Http_Client');

// connect to service
$svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
$user = "userid@gmail.com";
$pass = "secret";
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
$gphoto = new Zend_Gdata_Photos($client);

// get photo entry
// delete entry
try {
  $photo = $gphoto->getPhotoEntry('http://picasaweb.google.com/data/
  entry/api/user/userid/albumid/' . $aid . '/photoid/' . $pid);
  $photo->delete();
} catch (Zend_Gdata_App_Exception $e) {
  echo "Error: " . $e->getResponse();
}        
echo 'Photo successfully deleted!';  
?>

摘要

在最后几页中,您经历了速成课程,内容涉及如何使用SimpleXML和Zend客户端库将Picasa网络相册服务中的数据集成到PHP应用程序中。 本文中的示例向您介绍了Picasa Feed格式,向您展示了如何:

  • 检索相册和照片列表
  • 通过搜索词过滤这些列表; 添加,修改和删除照片; 并为Picasa服务构建自定义界面
  • 添加,修改和删除照片
  • 建立Picasa服务的自定义界面

如这些示例所示,Picasa网络相册数据API是一款功能强大且灵活的工具,适用于希望围绕照片管理和存储构建富有创意的新应用程序的开发人员。 有时玩,看看你的想法!


翻译自: https://www.ibm.com/developerworks/opensource/library/x-picasalbum/index.html

picasa csdn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值