使用Google Contacts API v3更新照片

时间:2015-10-09 22:55:20

标签: api coldfusion google-contacts

我正在尝试使用Google Contacts API v3更新/添加照片到现有联系人,但无法弄清楚如何操作。我正在使用ColdFusion。

我可以通过Google服务进行身份验证,阅读照片,显示照片,甚至删除照片。当我尝试为联系人更新或添加照片时,我收到错误请求的状态代码400 - 无效的图像文件。

这是我正在使用的代码:

<cfhttp method="put" url="https://www.google.com/m8/feeds/photos/media/myemail/contactid" result="chgphoto">
    <cfhttpparam type="header" name="Authorization" value="OAuth sessiontoken" >
    <cfhttpparam type="header" name="GData-Version" value="3.0">
    <cfhttpparam type="header" name="If-Match" value="*">
    <cfhttpparam name="Content-Type" type="header" value="image/jpeg">
    (THE NEXT LINE IS IS MY ISSUE - I THINK)
    <cfhttpparam type="body" value="E:\PATH\TO\FILE\image.jpg">
</cfhttp>

我已经尝试了许多很多组合,我相信我的问题在于,包括:

1. <cfhttpparam type="body" value="E:\PATH\TO\FILE\image.jpg">
2. <cfhttpparam type="body" value="/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAQABADASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEFBv/EACMQAAEDAwQCAwAAAAAAAAAAAAECAwUEESEABjEyEhNBYbH/xAAUAQEAAAAAAAAAAAAAAAAAAAAF/8QAHREAAgEEAwAAAAAAAAAAAAAAAREAAgMTwUGBof/aAAwDAQACEQMRAD8A2O4NxOmpeYZqFstNKKAG1FJJBIJJGeQQACOL5+CKk5WHqo9uWqQtmSd9bbDqiXmyeqs5sTYEE4uPsacrTS8DL1FbQxxlKCqV7FMAeSm3L3vbntc3A/AdStv7fnZzc7U5OMuU7TCw4lLo8VKUOqQnkAHOjRTcytl+LcLJuZeW+luf/9k=">
3. <cfhttpparam type="header" name="body" value="E:\PATH\TO\FILE\image.jpg">
4. <cfhttpparam type="xml" value="<link rel='http://schemas.google.com/contacts/2008/rel##photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/myemail/contactid'>">

当然,这些都不是正确的方法。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

如果您使用Content-Type: image/jpeg转移请求,则需要发送图片的(二进制)内容。所以只需这样做:

<cfhttpparam type="body" value="#fileRead("E:\PATH\TO\FILE\image.jpg")#">

编辑:请注意,对于较大的图像,您可能需要使用fileRead增加缓冲区大小。您可以提供最大大小作为第二个参数。

如果这不起作用,您可能需要将内容发送为HEX:

<cfhttpparam type="body" value="#binaryEncode(fileReadBinary("E:\PATH\TO\FILE\image.jpg"), "HEX")#">

编辑:请注意fileReadBinary没有缓冲区大小限制,并且在与大文件一起使用时可能会使服务器崩溃。

答案 1 :(得分:-1)

所以不幸的是,我发现初始答案不准确,因为使用#fileRead(“E:\ PATH \ TO \ FILE \ image.jpg”)#“&gt;只读取文件的一部分而不是全部结果是通过谷歌API保存的图像是乱码还是根本没有 - 即400 Bad Request。就是说,如果没有这个问题的原始响应者的输入,我就无法弄清楚正确的答案。

需要做的是一个两步过程......

首先,将文件读为二进制文件:

<cffile action="readbinary" file="E:\PATH\TO\FILE\image.jpg" variable="binimage">

其次,将其转换回'body'中的字符串:

<cfhttpparam type="body" value="#ToString(ToBinary(binimage))#">

一旦我这样做,图片就会通过Google API正确保存而不会出现乱码,因为它之前只是部分文件。

希望这有助于其他人。