【问题标题】:Updating Photo using Google Contacts API v3使用 Google Contacts API v3 更新照片
【发布时间】:2015-10-09 22:55:19
【问题描述】:

我正在尝试使用 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'>">

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

【问题讨论】:

    标签: api coldfusion google-contacts-api


    【解决方案1】:

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

    &lt;cfhttpparam type="body" value="#fileRead("E:\PATH\TO\FILE\image.jpg")#"&gt;

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


    如果这不起作用,您可能需要以 HEX 格式发送内容:

    &lt;cfhttpparam type="body" value="#binaryEncode(fileReadBinary("E:\PATH\TO\FILE\image.jpg"), "HEX")#"&gt;

    编辑:请注意,fileReadBinary 没有缓冲区大小限制,并且在处理大文件时可能会导致服务器崩溃。

    【讨论】:

    • 天哪,成功了!!!好的,为了清楚起见,任何阅读本文的人都可以使用 fileRead 推荐: fyi - 我也尝试将内容设置为十六进制,但我无法让它工作。无论如何,非常感谢亚历山大的帮助。我花了一周的时间试图解决这个问题!
    【解决方案2】:

    不幸的是,我发现最初的答案并不准确,因为使用 #fileRead("E:\PATH\TO\FILE\image.jpg")#"> 只读取文件的一部分而不是全部. 结果是通过 Google 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 正确保存,并且不会出现乱码,因为它之前只是一个部分文件。

    希望这对其他人有所帮助。

    【讨论】:

    • fileRead 有一个缓冲区大小(要读取的字符数)的可选参数。如果不提供,则使用 ColdFusion 的服务器默认值。如果您的(大)图像被截断,只需增加缓冲区大小即可完全读取它们。 fileReadBinary 不适用于大文件,因为它不限制缓冲区大小,并且可能会导致服务器崩溃,如 Adob​​e 文档中所述,因此请谨慎使用您的方法。
    • 不确定我是否遵循这个。 1) Google API 期望的值到底是什么类型? 2) 你为什么使用ToBinary()binimage 变量应该已经二进制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2014-09-08
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多