简体   繁体   中英

How do I convert an LDAP “jpegPhoto” to NSString to UIImageView

I am trying to pull an LDAP "jpegPhoto" attribute from an openLDAP server using a iOS openLDAP framework. The framework pulls the data as a dictionary of NSStrings.

I need to convert the NSString of "jpegPhoto" (which also appears to be base64 encoded) to UIImage, with the end result being that I display the jpegPhoto as the user's image when they login.

More Info:

-(NSDictionary *)doQuery:(NSString *)query:(NSArray *)attrsToReturn {
    ...
    while(attribute){
        if ((vals = ldap_get_values_len(ld, entry, attribute))){
            for(int i = 0; vals[i]; i++){
                //Uncomment if you want to see all the values.
                //NSLog(@"%s: %s", attribute, vals[i]->bv_val);
                if ([resultSet objectForKey:[NSString stringWithFormat:@"%s",attribute]] == nil){
                    [resultSet setObject:[NSArray arrayWithObject:[NSString stringWithFormat:@"%s",vals[i]->bv_val]] forKey:[NSString stringWithFormat:@"%s",attribute]];
                }else{
                    NSMutableArray *array = [[resultSet objectForKey:[NSString stringWithFormat:@"%s",attribute]] mutableCopy];
                    [array addObject:[NSString stringWithFormat:@"%s",vals[i]->bv_val]];
                    [resultSet setObject:array forKey:[NSString stringWithFormat:@"%s",attribute]];
                }
            }
            ldap_value_free_len(vals);
        };
        ldap_memfree(attribute);
        attribute = ldap_next_attribute(ld, entry, ber);
    };
    ...
}

-(UIIMage *)getPhoto{
    NSString *query = [NSString stringWithFormat:@"(uid=%@)",self.bindUsername];
    NSArray *attrsToReturn = [NSArray arrayWithObjects:@"cn",@"jpegPhoto", nil];
    NSDictionary *rs = [self doQuery:query:attrsToReturn];
    NSString *photoString = [[rs objectForKey:@"jpegPhoto"] objectAtIndex:0];
    NSLog(@"The photoString is: %i %@",[photoString length],@"characters long"); //returns 4
    NSData *photoData = [NSData dataWithBase64EncodedString:photoString];
    UIImage *userPhoto = [UIImage imageWithData:photoData];
    return userPhoto;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.studentNameLabel.text = [NSString stringWithFormat:@"Hi %@!",[self.ldap getFullName]];
    self.studentPhotoImage.image = [self.ldap getPhoto];
    [self checkForProctor];
}

Try this code

NSData *dataObj = [NSData dataWithBase64EncodedString:beforeStringImage];
UIImage *beforeImage = [UIImage imageWithData:dataObj];

There are many similar questions in Stackoverflow.. Please refer the following links

UIImage to base64 String Encoding

UIImage from bytes held in NSString

(Since there has been no working code posted for getting the image data from LDAP, I wanted to add this answer for the benefit of future visitors.)

The missing piece was reading the binary data into an NSData object rather than an NSString when you have binary data that might contain NULL (zero) values within it, such as images or GUIDs.

value = [NSData dataWithBytes:vals[0]->bv_val length:vals[0]->bv_len];

+ (NSArray *)searchWithBaseDN:(const char *)baseDN andFilter:(const char *)filter andScope:(int)scope {
    ...
    while(entry)
    {
        // create a dictionary to hold attributes
        NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

        attribute = ldap_first_attribute(ld, entry, &ber);
        while(attribute)
        {
            if ((vals = ldap_get_values_len(ld, entry, attribute)))
            {
                if (ldap_count_values_len(vals) > 1) {
                    NSMutableArray *values = [[NSMutableArray alloc] init];
                    for(int i = 0; vals[i]; i++) {
                        [values addObject:[NSString stringWithUTF8String:vals[i]->bv_val]];
                    }
                    [dictionary setObject:values forKey:[NSString stringWithUTF8String:attribute]];
                } else {
                    NSObject *value = nil;
                    if (strcmp(attribute, "thumbnailPhoto") == 0 || strcmp(attribute, "objectGUID") == 0) {
                        value = [NSData dataWithBytes:vals[0]->bv_val length:vals[0]->bv_len];
                    } else {
                        value = [NSString stringWithFormat:@"%s", vals[0]->bv_val];
                    }
                    [dictionary setObject:value forKey:[NSString stringWithUTF8String:attribute]];
                }


                ldap_value_free_len(vals);
            };
            ldap_memfree(attribute);
            attribute = ldap_next_attribute(ld, entry, ber);
        };
...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM