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
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:
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: