对活动目录进行ajax调用,并使用post提取缩略图照片

时间:2017-01-24 13:10:26

标签: javascript php jquery ajax

我想使用帖子从活动目录中检索信息(例如缩略图照片)。

<?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');
        }
    });
});

3 个答案:

答案 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));