我想使用帖子从活动目录中检索信息(例如缩略图照片)。
<?php
/**
* Get a list of users from Active Directory.
*/
$ldap_password = $_POST['password'];
$ldap_username = $_POST['username'];
$server = 'ldap://xxxxxxxxxxxxxxxxxxxxxx';
$domain = 'xxxxxxxxxxxxxxxxx';
$port = 389;
$ldap_connection = ldap_connect($server, $port);
if (FALSE === $ldap_connection){
// Uh-oh, something is wrong...
}
// We have to set this option for the version of Active Directory we are using.
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0); // We need this for doing an LDAP search.
if (TRUE === ldap_bind($ldap_connection, $ldap_username.$domain, $ldap_password)){
$ldap_base_dn = "OU=Employees,OU=Accounts,OU=xxxxx,DC=xxxxxx,DC=xxxxxxx,DC=com";
$search_filter = '(&(objectCategory=person)(samaccountname=*))';
$attributes = array();
$attributes[] = 'givenname';
$attributes[] = 'mail';
$attributes[] = 'samaccountname';
$attributes[] = 'sn';
$result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter, $attributes);
$maxPageSize = 1000;
if (FALSE !== $result){
$entries = ldap_get_entries($ldap_connection, $result);
for ($x=0; $x<$entries['count']; $x++){
if (!empty($entries[$x]['givenname'][0]) &&
!empty($entries[$x]['mail'][0]) &&
!empty($entries[$x]['samaccountname'][0]) &&
!empty($entries[$x]['sn'][0]) &&
'Shop' !== $entries[$x]['sn'][0] &&
'Account' !== $entries[$x]['sn'][0]){
$ad_users[strtoupper(trim($entries[$x]['samaccountname'][0]))] = array('email' => strtolower(trim($entries[$x]['mail'][0])),'first_name' => trim($entries[$x]['givenname'][0]),'last_name' => trim($entries[$x]['sn'][0]));
}
}
}
ldap_unbind($ldap_connection); // Clean up after ourselves.
}
$message .= "Retrieved ". count($ad_users) ." Active Directory users\n";
?>
我尝试使用http://localhost:8666/web1/activedirectory.php
查看是否返回任何内容,但返回以下错误,因为结果为&gt; 1000。
警告:ldap_search():返回部分搜索结果:第28行的C:\ xampp \ htdocs \ web1 \ activedirectory.php中超出了Sizelimit
注意:未定义的变量:第46行的C:\ xampp \ htdocs \ web1 \ activedirectory.php中的消息
下面是我要将.php
文件链接到上述文件的jquery:
$('.leaderboard li').on('click', function () {
$.ajax({
url: "../popupData/activedirectory.php", // php file with link to the active directory.
type: "POST",
data: {id:$(this).find('.parent-div').data('id')},
success: function(data){
console.log(data);
data = JSON.parse(data);
$('#popup').fadeIn();
//call for the thumbnail photo
// etc ..
},
error: function(){
alert('failed, possible script does not exist');
}
});
});
答案 0 :(得分:11)
第一个问题:
您必须添加img
元素,而不是像这样设置文本:
$('#imagesofBadges').append('<img src="' + data[0].BadgeImage + '"/>');
第二个问题:
附加图片时添加一个class属性,这样你就可以使用这个类名来使用jQuery获取它们,如下所示:
var $img = $('<img src="' + data[0].BadgeImage + '"/>'); // create the image
$img.addClass('badge-image'); // add the class .badge-image to it
$('#imagesofBadges').append($img); // append it
现在您可以使用这样的选择器获取这些图像:
$('#imagesofBadges .badge-image'); // will fetch all the elements that have the class .badge-image that are inside #imagesofBadges.
修改强>
如果你想在追加新版本之前删除#imagesofBadges
内的所有图片,请使用:
// fetch all the images inside #imagesofBadges and remove them
$('#imagesofBadges img').remove();
// append the new image
$('#imagesofBadges').append('<img src="' + data[0].BadgeImage + '"/>');
答案 1 :(得分:6)
首先,你得到的错误与POST,AJAX或PHP 无关。它是由LDAP查询过于通用引起的:
ldap_search(): Partial search results returned: Size limit exceeded
每个jQuery调用只能返回一个图像,因此您需要逐个检索缩略图,每次调用需要搜索并只返回一条记录(即阅读,而不是搜索。)
这意味着您需要在PHP调用中发送您的用户ID,以便脚本可以知道要返回哪个缩略图...这样就可以了。
但PHP 未使用该信息。您搜索所有名称,这意味着它无论如何都无法工作,但它甚至没有启动,因为LDAP搜索会破坏。
$search_filter = '(&(objectCategory=person)(samaccountname=*))';
在上面的行中,您需要添加一些过滤器。例如,您在排行榜中获得的SAM帐户名称是否为ID?如果是这样,您可以执行类似
的操作$kid = 'NonExistingAccount';
if (preg_match('#SAM_NAME_MATCHING_REGEX#', $_POST['id'])) {
$kid = $_POST['id'];
}
$search_filter = "(&(objectCategory=person)(samaccountname={$kid}))";
并确保只检索一条记录。此时你可以去提取图像(如果内存服务的是位图格式),并将其转换为适合jQuery的形式:
$bitmap = $entries[0]['picture'];
// Some error checking would probably be good
$gd = imageCreateFromString($bitmap);
// Here you'll probably want to resize your image. Create
// another GD object with ImageCreateTrueColor and use imageCopyResampled
// with the appropriate size.
// Then, inform jQuery that a PNG is coming along
header('Content-Type: image/png');
// and send the PNG
imagePNG($gd);
// and nothing else (shouldn't matter, but you never know, and anyway...).
exit();
您的HTML部分包含多个元素(例如,您的员工)。
非常重要:此部分将由PHP使用LDAP搜索生成,以便您获得所需的信息。您可能需要对LDAP搜索进行分页,以避免返回太多结果(和错误),如前所述。
但是一旦你这样做,你将拥有每个用户的专有名称。
<ul class="leaderboard">
...
<li data-dn="CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM">
<img class="placeholder" />
<span class="cn">Jeff Smith</span>
<span class="ou">Sales</span>
</li>
...
</ul>
在上面,您从LDAP搜索中读取了“Jeff Smith”等。但你不能轻易地在PHP中放置图像,HTML不允许它(好的,it does, as this answer to a similar question as yours shows,但是你不愿意),所以你把占位符放在适当的位置使用CSS的大小。
您还可以在图片中放置一个动画GIF,上面写着“loading ...”。
为了提高效率,请将其保存在data-dn属性the DN of each result中。
单击或onload(),或者如果页面更改时有AJAX分页,则检索所有图像。这与您已有的代码非常相似。
$('.leaderboard li').on('click', function () {
// Get the image. This returns nothing if it has already been loaded.
var img = $(this).find('img.placeholder');
if (img.length === 0) { return; }
var dn = $(this).attr('data-dn');
// Load image from its DN.
// See https://stackoverflow.com/questions/4285042/asychronously-load-images-with-jquery
img.src = 'load-image.php?dn=' + dn;
});
load-image.php
脚本将收到$_GET['dn']
,并需要使用提供的DN执行LDAP read,并检索相应的图片属性。
然后您只需使用header()
和您喜欢的image*()
函数输出它(例如imageJPEG()或imagePNG())。
您可以在AJAX中执行此操作并发送编码为base64的图像(上面的链接中的代码),但它更复杂,并且保存只发送一个呼叫而不是20个图像的二十个图像的时间会立即丢失,感兴趣,当你需要发送编码为base64而不是二进制的JPEG时,如果你的web服务器对base64进行gz编码,那么你的大小会增加5-10%(如果没有,则大小增加33%)。
答案 2 :(得分:0)
使用类似
的内容$('#imagesofBadges').append($("<img>").prop("src", data[0].BadgeImage));