2011-08-20 61 views
10

我发现的用于创建Picasa相册和上传图片的所有教程均使用我没有研究过的Zend Framework。使用PHP和cURL创建Picasa相册并上传图片

是否可以使用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 ; 

我用下面的代码获取谷歌客户端验证码:

<?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' => 'youremailadd[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 
?> 

任何人都可以提供一些指导,建立一个名为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响应数据获取相册照片

参考,应该有这样的事情:

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

回答

4

下面是创建相册一些代码。我们将拿起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); 
+0

哎,这些都是在官方网站的一些指导,我看过了,但还是不知道如何将它写入PHP代码。另一个问题,我上传时如何添加照片许可证?谢谢。 –

+0

我已更新了专辑创建的代码。我会发布一些照片上传代码,如果我能弄清楚。 –

+0

好的,我终于找到了一些上传图片的工作代码。尽管如此,我仍然在努力上传带有元数据的图片。 –

1

扩大马克的回答,您可以直接使用CURLOPT_POSTFIELDS卷曲发送XML。然而,而不是做一个关联数组,尝试通过实际的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);