2013-03-29 36 views
2

我試圖從OpenLDAP服務器保存映像。它採用二進制格式,我的所有代碼都可以正常工作,但是圖像已損壞。使用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庫 「形象-JPEG」,實際上是二進制和不是一個字符串?是否有更好的簡單庫可用於從LDAP服務器讀取二進制數據?從查看Apache郵件列表someone else had a similar issue,但我找不到線程中的解決方案。

技術堆棧

回答

0

我找到了答案。 Apache Groovy LDAP庫使用JNDI。使用JNDI時,某些條目會自動讀取爲二進制文件,但是如果您的LDAP服務器使用自定義名稱,則該庫不會知道它是二進制文件。

對於那些使用Grails遇到此問題的人,以下是將特定條目設置爲二進制格式的步驟。

  • 創建一個新的屬性文件調用「jndi.properties」並將其添加到您的grails-app/conf目錄(該文件夾中的所有屬性文件會自動包含在類路徑)

  • 添加在屬性一行的文件與圖像變量的名稱:

    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   
    }   
} 
1

你檢查圖像的屬性值是否是base-64編碼?

+0

我包含上面的PHP代碼,以顯示它確實是二進制,而不是Base64編碼。好的建議,但。 – arcdegree

相關問題