使用PHP和cURL创建Picasa相册并上传图片

12

我找到的所有有关创建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的相册并将图片上传到其中吗?

编辑1:

如何在使用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"
        },
2个回答

6

以下是创建相册的代码。我们将从使用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);

嗨,这些是官方网站上的一些指南,我已经阅读了,但仍然不知道如何将其编写为PHP代码。另一个问题是,上传时如何添加照片许可证?谢谢。 - yuli chika
我已经更新了相册创建的代码。如果我能弄清楚,我会发布一些照片上传的代码。 - Mark Biek
好的,我终于有了一些可用的上传图像代码。但是我仍然在努力上传带有元数据的图像。 - Mark Biek
@mark-beik 怎样才能使用远程图片URL(http://www.omgubuntu.co.uk/wp-content/uploads/2016/11/go-for-it-linux-app.jpg)?我尝试了 $imgData = file_get_contents("$direct_img_url") 但没有元数据,为什么它不起作用呢? - Khurshid Alam
@KhurshidAlam 抱歉,我真的不知道。您可以提供一个演示您问题的测试用例,并将其发布为新问题。 - Mark Biek
显示剩余2条评论

1
扩展Mark的答案,您可以使用CURLOPT_POSTFIELDS直接从curl发送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);  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接