views:

252

answers:

1

So after scouring the Internet I pieced together the following code to upload a photo for a Google Contact:

System.Drawing.Bitmap Image = new Bitmap( @"C:\test.jpg" );
System.IO.MemoryStream Memory = new MemoryStream();
Image.Save( Memory, System.Drawing.Imaging.ImageFormat.Jpeg );

Service.Update
    (
        Contact.PhotoEditUri, 
        Memory, 
        "image/jpeg", 
        null
    );

The Service is using ClientLogin authentication. Before this code runs, I have successfully retrieved the contact.

After this code runs, however, I get a GDataRequestException. The error message returned is, "A temporary internal problem has occurred. Try again later". The error message in the InnerException contains the following, "The remote server returned an error: (500) Internal Server Error."

After yet more research, I found hints that the error codes from the Google service may not be all that descriptive - and may simply return error 500. Though I don't know how true this is.

So maybe the problem is with my code? Or even better, does anybody have sample code to demonstrate how this should be done?

Thanks,

Camel

A: 

I found out two ways to resolve this problem (the transcript is in this Google Contacts API post). First, you can create a stream that accesses the file directly, like so:

System.IO.FileStream File = new FileStream( @"C:\test.jpg" );

Service.Update
    (
        Contact.PhotoEditUri, 
        File, 
        "image/jpeg", 
        null
    );

Second, the reason why my original code failed was because I had to reset the position inside the MemoryStream. This is what I get for being such a noob on streams. Once the Image.Save function completes, the position is at the end. So, all you have to do is reset the position to the beginning:

System.Drawing.Bitmap Image = new Bitmap( @"C:\test.jpg" );
System.IO.MemoryStream Memory = new MemoryStream();
Image.Save( Memory, System.Drawing.Imaging.ImageFormat.Jpeg );
Memory.Seek( 0, SeekOrigin.Begin );

Service.Update
    (
        Contact.PhotoEditUri, 
        Memory, 
        "image/jpeg", 
        null
    );
Camel