如何使用cfldap更改用户图像?

时间:2015-10-15 08:32:03

标签: coldfusion ldap

我能够从cfldap获得我想要的所有值。 但是当我尝试更新用户图像时,我不知道如何为二进制图像属性发送正确的值。

我尝试从cffile upload

获取图像变量
<cffile action="UPLOAD" filefield="file" destination="c:\inetpub\wwwroot\test" nameconflict="OVERWRITE"  result="image" />

还尝试将cfimage与静态图像一起使用 -

<cfimage action="read" source="c:\inetpub\wwwroot\test\image.png" name="anotherImage">

甚至是

<cffile action="READBINARY" file="c:\inetpub\wwwroot\test\image.png" variable="BinaryImageContent"> 

但无论如何,当我打电话时

<cfldap action="modify" 
  DN="#results.dn#" 
  attributes="thumbnailPhoto=#obj.image#" 
  modifytype="replace" 
  server="myserver"
  username="mydomain\myuser" 
password="mypass">

#results.dn#是我之前收到的用户的DN(一切都好) 我创建了#obj.image#以便能够尝试所有类型的变量

也试过这些参数:

  <cfset obj.test1 = BinaryImageContent />
  <cfdump var="#imageGetBlob(anotherImage)#" />
  <cfdump var="#toString(obj.test1)#" />

顺便说一下,我得到它的错误

  

一个或多个必需属性可能缺失或不正确或   您无权在服务器上执行此操作。

问题是我使用域管理员帐户来更新

(这个错误已经解决了 - 网络人员没有给我这个许可......现在我有了。)

现在我正在使用的是以下内容:

<cffile action="UPLOAD" filefield="file" destination="c:\inetpub\wwwroot\test" nameconflict="OVERWRITE"  result="imagem" />
<cfset filename = "C:\inetpub\wwwroot\test\#imagem.serverFile#">
<cffile action="readbinary" file="#filename#" variable="img">
<cfset imgStr = BinaryEncode(img, "hex")>
<cfset imgStr2 = REReplace(imgStr, "..", "\\\0", "ALL")>
<cfldap
  action="modify" 
  DN="#results.dn#" 
  attributes="thumbnailPhoto=#imgStr2#" 
  modifytype="replace" 
  server="myserver"
  username="mydomain\myuser" 
  password="mypass"
>

但是我得到了这个二进制代码

enter image description here

奇怪的是,在我有一个像-1-41这样的二进制代码之前,现在没有类似的......

当我试图显示图片时

enter image description here

这是一个正确的形象...... enter image description here

1 个答案:

答案 0 :(得分:2)

编辑:下面的原始代码示例显示了如果ColdFusion在CFLDAP中没有错误(或“非常不幸的设计决策”), 的工作方式。< / p>

CFLDAP在将它们发送到服务器之前对您传递给它的参数值进行编码。这很好,因为您不必担心值编码。但是......它也没有帮助,因为它意味着你不能再自己发送编码值了,因为CF总是将它们再次编码为

结论:就LDAP而言,将文件编码为十六进制字符串是正确的,但CFLDAP在将该字符串发送到服务器之前会破坏该字符串。结合CFLDAP不接受原始二进制数据这一事实,这意味着您无法使用它来更新二进制属性。

这些评论包含对第三方命令行工具的建议,该工具可以轻松替代CFLDAP执行此任务。

您需要将编码的字符串作为属性值发送到服务器。 LDAP查询中二进制数据的编码方案的格式为attribute=\01\02\03\ab\af\cd

将您的图像读入字节数组,将该数组编码为十六进制字符串,并使用反斜杠为每个编码字节添加前缀。

<击>     

<击>
<cffile action="readbinary" file="#filename#" variable="img">
<cfset imgStr = BinaryEncode(img, "hex")>
<cfset imgStr = REReplace(imgStr, "..", "\\\0", "ALL")>

<cfldap
  action="modify" 
  DN="#results.dn#" 
  attributes="thumbnailPhoto=#imgStr#" 
  modifytype="replace" 
  server="myserver"
  username="mydomain\myuser" 
  password="mypass"
>

<击>

另外,请不要忘记modifyType$param_array = array( array( 'var_1' => 1, 'var_2' => 2, ), array( 'var_1' => 3, 'var_2' => 4, ), ); $result = $client->call('test', array('param_1' => 123, 'param_2' => $param_array)); 的评论。