Search code examples
.netgdata-apipicasa

How can I upload a photo to Picasa via the GData APIs, from .NET?


Similar to Simple example to upload photos into google picasa, which is about python; this one is about .NET.

How to use the ClientLogin protocol, and then how to do the multipart/related form POST, as required by Google?


Solution

  • Apparently there is a class library that is packaged to do this. What I really wanted was the HTTP protocol required to do it. Using the Google API documentation for Picasa, this is what I figured out.

    A request looks like this:

    POST https://picasaweb.google.com/data/feed/api/user/default/albumid/default HTTP/1.1
    GData-Version: 2.0
    Authorization: GoogleLogin auth=DQAAAJgAAAD_....-tTM2ZliWDzXLA
    Content-Type: multipart/related; boundary="1292107594356"
    Host: picasaweb.google.com
    Content-Length: 5415
    Expect: 100-continue
    
    Media multipart posting
    --1292107594356
    Content-Type: application/atom+xml
    
    <entry xmlns='http://www.w3.org/2005/Atom'>
      <title>DesiredFileNameOnGoogle.jpg</title>
      <summary>uploaded from PicasaUpload</summary>
      <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/photos/2007#photo'/>
    </entry>
    --1292107594356
    Content-Type: image/jpeg
    
     (binary content here)
    --1292107594356--
    

    A response looks like this:

    HTTP/1.1 201 Created
    Expires: Sat, 11 Dec 2010 22:46:26 GMT
    Date: Sat, 11 Dec 2010 22:46:26 GMT
    Cache-Control: private, max-age=0, must-revalidate, no-transform
    Set-Cookie: _rtok=y6u5yQV84QUO; Path=/; Secure; HttpOnly
    Set-Cookie: S=photos_html=lIi6RQVuq7F1iAQHMpMkUA; Domain=.google.com; Path=/; Secure; HttpOnly
    Content-Type: application/atom+xml; charset=UTF-8; type=entry
    Vary: Accept, X-GData-Authorization, GData-Version
    GData-Version: 2.0
    ETag: "YD0qeyI."
    Location: https://picasaweb.google.com/data/entry/api/user/1018683/albumid/55399652081/photoid/5549567010?authkey=Gv1sRgCJrQ5qeYxISo5gE
    Content-Location: https://picasaweb.google.com/data/entry/api/user/1018683/albumid/55399652081/photoid/5549567010?authkey=Gv1sRgCJrQ5qeYxISo5gE
    X-Content-Type-Options: nosniff
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    Server: GSE
    Transfer-Encoding: chunked
    

    And then the Atom payload in the response is like this:

    <?xml version='1.0' encoding='UTF-8'?>
    <entry xmlns='http://www.w3.org/2005/Atom' xmlns:exif='http://schemas.google.com/photos/exif/2007' xmlns:app='http://www.w3.org/2007/app' xmlns:gphoto='http://schemas.google.com/photos/2007' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='&quot;YD0qeyI.&quot;'>
      <id>https://picasaweb.google.com/data/entry/user/1018683/albumid/5549217276399652081/photoid/5549498718938958882</id>
      <published>2010-12-11T18:49:18.000Z</published>
      <updated>2010-12-11T18:49:18.319Z</updated>
      <app:edited>2010-12-11T18:49:18.319Z</app:edited>
      <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#photo'/>
      <title>CropperCapture[30].jpg</title>
      <summary>woof!</summary>
      <content type='image/jpeg' src='https://lh5.googleusercontent.com/_-Mw_MhEEB_U/TQPHrq_XjCI/AAAAAAAAABQ/wu5AI7QfmWQ/CropperCapture%5B30%5D.jpg'/>
      <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://picasaweb.google.com/data/feed/api/user/1018683/albumid/5549217276399652081/photoid/5549498718938958882?authkey=Gv1sRgCJrQ5qeYxISo5gE'/>
      <link rel='alternate' type='text/html' href='http://picasaweb.google.com/1018683/DropBox?authkey=Gv1sRgCJrQ5qeYxISo5gE#5549498718938958882'/>
      <link rel='http://schemas.google.com/photos/2007#canonical' type='text/html' href='http://picasaweb.google.com/lh/photo/lzJ9Ya6NeZM8sPeVfFcn98QJQ0GDj3dCNP33YlpCH6E'/>
      <link rel='self' type='application/atom+xml' href='https://picasaweb.google.com/data/entry/api/user/1018683/albumid/5549217276399652081/photoid/5549498718938958882?authkey=Gv1sRgCJrQ5qeYxISo5gE'/>
      <link rel='edit' type='application/atom+xml' href='https://picasaweb.google.com/data/entry/api/user/1018683/albumid/5549217276399652081/photoid/5549498718938958882?authkey=Gv1sRgCJrQ5qeYxISo5gE'/>
      <link rel='edit-media' type='image/jpeg' href='https://picasaweb.google.com/data/media/api/user/1018683/albumid/5549217276399652081/photoid/5549498718938958882?authkey=Gv1sRgCJrQ5qeYxISo5gE'/>
      <link rel='http://schemas.google.com/photos/2007#report' type='text/html' href='http://picasaweb.google.com/lh/reportAbuse?uname=1018683&amp;aid=5549217276399652081&amp;iid=5549498718938958882'/>
      <gphoto:id>5549498718938958882</gphoto:id>
      <gphoto:albumid>5549217276399652081</gphoto:albumid>
      <gphoto:access>private</gphoto:access>
      <gphoto:width>441</gphoto:width>
      <gphoto:height>287</gphoto:height>
      <gphoto:size>26876</gphoto:size>
      <gphoto:checksum/>
      <gphoto:timestamp>1292093358000</gphoto:timestamp>
      <gphoto:imageVersion>20</gphoto:imageVersion>
      <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
      <gphoto:commentCount>0</gphoto:commentCount>
      <gphoto:license id='0' name='All Rights Reserved' url=''>ALL_RIGHTS_RESERVED</gphoto:license>
      <exif:tags>
        <exif:imageUniqueID>abfde2a4ab9f9e177865ba4fd50e7edb</exif:imageUniqueID>
      </exif:tags>
      <media:group>
        <media:content url='https://lh5.googleusercontent.com/_-Mw_MhEEB_U/TQPHrq_XjCI/AAAAAAAAABQ/wu5AI7QfmWQ/CropperCapture%5B30%5D.jpg' height='287' width='441' type='image/jpeg' medium='image'/>
        <media:credit>User Name</media:credit>
        <media:description type='plain'>woof!</media:description>
        <media:keywords/>
        <media:thumbnail url='https://lh5.googleusercontent.com/_-Mw_MhEEB_U/TQPHrq_XjCI/AAAAAAAAABQ/wu5AI7QfmWQ/s72/CropperCapture%5B30%5D.jpg' height='47' width='72'/>
        <media:thumbnail url='https://lh5.googleusercontent.com/_-Mw_MhEEB_U/TQPHrq_XjCI/AAAAAAAAABQ/wu5AI7QfmWQ/s144/CropperCapture%5B30%5D.jpg' height='94' width='144'/>
        <media:thumbnail url='https://lh5.googleusercontent.com/_-Mw_MhEEB_U/TQPHrq_XjCI/AAAAAAAAABQ/wu5AI7QfmWQ/s288/CropperCapture%5B30%5D.jpg' height='188' width='288'/>
        <media:title type='plain'>CropperCapture[30].jpg</media:title>
      </media:group>
    </entry>