Как загрузить фотографию для контакта с помощью клиентской библиотеки Google Contact .NET - PullRequest
0 голосов
/ 01 марта 2009

Так что после поиска в Интернете я собрал следующий код для загрузки фотографии в контакт Google:

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

Сервис использует аутентификацию ClientLogin. Перед выполнением этого кода я успешно получил контакт.

Однако после выполнения этого кода я получаю GDataRequestException. Возвращаемое сообщение об ошибке: «Произошла временная внутренняя проблема. Повторите попытку позже». Сообщение об ошибке в InnerException содержит следующее: «Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.»

После еще одного исследования я обнаружил намеки на то, что коды ошибок из службы Google могут быть не такими описательными - и могут просто возвращать ошибку 500. Хотя я не знаю, насколько это верно.

Так может проблема в моем коде? Или даже лучше, у кого-нибудь есть пример кода, демонстрирующий, как это должно быть сделано?

Спасибо

Camel

1 Ответ

0 голосов
/ 06 марта 2009

Я нашел два способа решения этой проблемы (расшифровка в этом сообщении API контактов Google ). Во-первых, вы можете создать поток, который напрямую обращается к файлу, например:

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

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

Во-вторых, причина, по которой мой оригинальный код не удался, была в том, что мне пришлось сбросить позицию внутри MemoryStream. Это то, что я получаю за то, что я такой нуб на потоках. Как только функция Image.Save завершается, позиция находится в конце. Итак, все, что вам нужно сделать, это сбросить позицию в начало:

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
    );
...