【问题标题】:Create a Picasa album and upload images to it with PHP and cURL创建 Picasa 相册并使用 PHP 和 cURL 将图像上传到其中
【发布时间】:2012-03-23 23:20:20
【问题描述】:

我发现的所有创建 Picasa 相册和上传图片的教程都使用了我没有研究过的 Zend 框架。

是否可以使用 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获取相册照片的响应数据,应该有这样的:

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

【问题讨论】:

    标签: php picasa


    【解决方案1】:

    以下是创建相册的一些代码。我们将使用 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代码。另一个问题,我上传时如何添加照片许可证?谢谢。
    • 我已经更新了专辑创建代码。如果我能弄清楚,我会发布一些照片上传代码。
    • 好的,我终于有了一些上传图片的工作代码。不过,我仍在努力上传带有元数据的图像。
    • 最终更新包括上传照片带有元数据的示例。我遇到了一些问题,最终归结为错误地计算了 Content-Length。您可以在这里阅读所有相关信息:stackoverflow.com/a/9841778/305
    • @mark-beik 如何使其与远程图像 url (omgubuntu.co.uk/wp-content/uploads/2016/11/…) 一起使用?我尝试使用没有元数据的$imgData = file_get_contents("$direct_img_url"),但它没有用。为什么?
    【解决方案2】:

    扩展 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);  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多