使用Python将base64编码图像推送到Google联系人

使用Python将base64编码图像推送到Google联系人,python,google-api,base64,google-contacts-api,Python,Google Api,Base64,Google Contacts Api,我有一个base64编码的jpeg图像,我想使用API将其作为Google联系人照片推送,如下所述: 查看ChangePhoto方法的文档可以得到以下信息: Type: instancemethod String form: <bound method ContactsClient.change_photo of <gdata.contacts.client.ContactsClient object at 0x104756090>> File:

我有一个base64编码的jpeg图像,我想使用API将其作为Google联系人照片推送,如下所述:

查看ChangePhoto方法的文档可以得到以下信息:

Type:        instancemethod
String form: <bound method ContactsClient.change_photo of <gdata.contacts.client.ContactsClient object at 0x104756090>>
File:        /Library/Python/2.7/site-packages/gdata/contacts/client.py
Definition:  a.ChangePhoto(self, media, contact_entry_or_url, content_type=None, content_length=None, auth_token=None, **kwargs)
Docstring:
Change the photo for the contact by uploading a new photo.

Performs a PUT against the photo edit URL to send the binary data for the
photo.

Args:
  media: filename, file-like-object, or a gdata.data.MediaSource object to send.
  contact_entry_or_url: ContactEntry or str If it is a ContactEntry, this
                        method will search for an edit photo link URL and
                        perform a PUT to the URL.
  content_type: str (optional) the mime type for the photo data. This is
                necessary if media is a file or file name, but if media
                is a MediaSource object then the media object can contain
                the mime type. If media_type is set, it will override the
                mime type in the media object.
  content_length: int or str (optional) Specifying the content length is
                  only required if media is a file-like object. If media
                  is a filename, the length is determined using
                  os.path.getsize. If media is a MediaSource object, it is
                  assumed that it already contains the content length.
类型:instancemethod
字符串形式:
文件:/Library/Python/2.7/site-packages/gdata/contacts/client.py
定义:a.ChangePhoto(self、media、contact_entry_或url、content_type=None、content_length=None、auth_token=None、**kwargs)
文档字符串:
通过上载新照片更改联系人的照片。
对照片编辑URL执行PUT,以发送照片的二进制数据
照片。
Args:
媒体:文件名、类似文件的对象或要发送的gdata.data.MediaSource对象。
contact\u entry\u或\u url:ContactEntry或str如果是ContactEntry,则此
方法将搜索编辑照片链接URL和
对URL执行PUT。
content_type:str(可选)照片数据的mime类型。这是
如果介质是文件或文件名,则为必需,但如果介质
是媒体源对象,则媒体对象可以包含
mime类型。如果设置了媒体类型,它将覆盖
媒体对象中的mime类型。
content_length:int或str(可选),指定内容长度为
仅当介质是类似文件的对象时才需要。如果媒体
是文件名,长度由
os.path.getsize。如果媒体是MediaSource对象,则为
假设它已经包含内容长度。
我的问题是,我没有类似文件的对象。我想我唯一的选择就是创建一个gdata.data.MediaSource对象。问题是我找不到任何关于如何正确构造这样一个对象的好文档


如何从base64编码的图像构造这样一个gdata.data.MediaSource对象。如何正确指定内容类型和内容长度?

Python为您提供了内存中类似文件的对象。在Python2上,使用(在极少数情况下,C优化版本缺失时,可回退到
StringIO.StringIO
):


我假设您的Base64编码图像数据(存储在
中的\u image\u数据是直接编码的,而不是文件。

是一个类似文件的对象。不幸的是,MediaSource对象只是将信息存储在文件类型对象上,因此这对您没有帮助。base64编码的图像如何存储在您的程序中?我得到以下错误:服务器响应:415,内容类型图像/jpeg是不是有效的输入类型。我尝试将其更改为image/png和image/*,但都不起作用。我的image\u数据中的数据看起来像png图像的字节码(开头有一个“png”)。@utdiscant:有趣;我以为你有一个JPEG(你的问题是这样的)。你可以尝试
image/jpg
(更常见的mime类型,我的错误)@utdiscant:但是JPEG从F9开始字节(并在其中某处包含ascii字符JFIF或EXIF),PNG是89,然后是PNG,然后是0D 0A 1A 0A。@utdiscant:否则,很难说没有实际数据会发生什么。现在我有了一个开头带有“JFIF”的图像。Google仍然返回一个“服务器响应为:415,内容类型image/jpg不是有效的输入类型。”。它似乎只是简单地拒绝任何图像/*内容类型。
try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO

image_data = your_image_data.decode('base64')
image_file = StringIO(image_data)

a.ChangePhoto(
    image_file, contact_url, content_type='image/jpg',
    content_length=len(image_data))