[英]Reading and saving binary image from OpenLDAP server using Groovy
我正在尝试从OpenLDAP服务器保存图像。 它为二进制格式,我的所有代码似乎都可以工作,但是图像已损坏。
然后,我尝试在PHP中执行此操作并成功,但是我想在Grails项目中执行此操作。
PHP示例(有效)
<?php
$conn = ldap_connect('ldap.example.com') or die("Could not connect.\n");
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
$dn = 'ou=People,o=Acme';
$ldap_rs = ldap_bind($conn) or die("Can't bind to LDAP");
$res = ldap_search($conn,$dn,"someID=123456789");
$info = ldap_get_entries($conn, $res);
$entry = ldap_first_entry($conn, $res);
$jpeg_data = ldap_get_values_len( $conn, $entry, "someimage-jpeg");
$jpeg_filename = '/tmp/' . basename( tempnam ('.', 'djp') );
$outjpeg = fopen($jpeg_filename, "wb");
fwrite($outjpeg, $jpeg_data[0]);
fclose ($outjpeg);
copy ($jpeg_filename, '/some/dir/test.jpg');
unlink($jpeg_filename);
?>
Groovy示例(无效)
def ldap = org.apache.directory.groovyldap.LDAP.newInstance('ldap://ldap.example.com/ou=People,o=Acme')
ldap.eachEntry (filter: 'someID=123456789') { entry ->
new File('/Some/dir/123456789.jpg').withOutputStream {
it.write entry.get('someimage-jpeg').getBytes() // File is created, but image is corrupted (size also doesn't match the PHP version)
}
}
我如何告诉Apache LDAP库“ image-jpeg”实际上是二进制而不是字符串? 是否有更好的简单库可用于从LDAP服务器读取二进制数据? 通过查看Apache邮件列表, 其他人也遇到了类似的问题 ,但是我在线程中找不到解决方案。
技术栈
您是否检查过图像属性值是否为base-64编码?
我找到了答案。 Apache Groovy LDAP库在幕后使用JNDI。 使用JNDI时,某些条目会自动读取为二进制,但是如果您的LDAP服务器使用自定义名称,则库将不会知道它是二进制。
对于使用Grails遇到此问题的人们,以下是将特定条目设置为二进制格式的步骤。
创建一个名为“ jndi.properties”的新属性文件,并将其添加到grails-app / conf目录中(此文件夹中的所有属性文件都会自动包含在类路径中)
在属性文件中添加带有image变量名称的行:
java.naming.ldap.attributes.binary=some_custom_image
保存文件并运行Grails应用程序
这是一些将二进制条目保存到文件中的示例代码。
def ldap = LDAP.newInstance('ldap://some.server.com/ou=People,o=Acme')
ldap.eachEntry (filter: 'id=1234567') { entry ->
new File('/var/dir/something.jpg').withOutputStream {
it.write entry.image
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.