我发现的创建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
的相册并将图片上传到相册中提供一些指导吗?
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 get album photo的响应数据,应该有类似的内容:
"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"
},
答案 0 :(得分: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);
答案 1 :(得分: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);