Получить изображение из OpenDJ ldap через Java

Я добавил изображение пользователю через панель управления OpenDJ, но не могу получить это изображение, чтобы показать его на веб-странице. Я нашел два атрибута thumbnailPicture и photo и попытался получить к ним доступ следующим образом:

NamingEnumeration<?> namingEnum = ctx.search(baseFilter, "(uid="+username+")", searchControls);

                if (namingEnum.hasMore ()){
                    SearchResult result = (SearchResult) namingEnum.next ();    
                    Attributes attrs = result.getAttributes ();
                    photo=(String)attrs.get("thumbnailPicture").get() ;
                }

С кодом все в порядке, потому что я могу получить адрес электронной почты, например, когда я меняю photo=(String)attrs.get("thumbnailPicture").get() ;

to

photo=(String)attrs.get("mail").get() ;

Я заметил, что при добавлении изображения через панель управления OpenDJ оно проходит через кнопку обзора, поэтому я предполагаю, что путь должен быть где-то сохранен?

Я не получаю никаких сообщений об ошибках (полагаю, потому что атрибуты thumbnailPicture и photo не заполнены в OpenDJ, поэтому они возвращаются пустыми), но мне бы хотелось:

  • путь к сохраненной картинке, но это только предположение, что OpenDJ действительно хранит эту информацию?
  • возможность получить изображение, но я не уверен, что оно сохраняется в OpenDJ. Код теперь предназначен для пути к файлу (поэтому есть приведение к String).

person Noosrep    schedule 31.07.2015    source источник
comment
Меня озадачивает ваше упоминание в тексте thumbnailPicture и photo, но код показывает thumbnailPhoto?   -  person JnRouvignac    schedule 01.08.2015
comment
Кроме того, вы используете JNDI. Почему вместо этого вы не используете более современный OpenDJ SDK?   -  person JnRouvignac    schedule 01.08.2015
comment
@JnRouvignac JNDI работает, почему бы вам его не использовать? Протокол LDAP не изменился.   -  person user207421    schedule 01.08.2015
comment
JNDI действительно работает, но API не очень хорош. Код, использующий его, неуклюж и трудно читаем.   -  person JnRouvignac    schedule 02.08.2015
comment
@JnRouvignac, ты прав, это не сработает, если я не использую правильный атрибут ..   -  person Noosrep    schedule 02.08.2015
comment
@JnRouvignac Это не причина полностью менять существующую реализацию, и уж точно не решение этой проблемы, какой бы она ни была. И напротив, JNDI уже присутствует в JDK.   -  person user207421    schedule 02.08.2015
comment
Я предложил альтернативу. Я никогда не говорил делать это сейчас. Ничто не говорит о том, является ли этот код новым или старым. Хотя это не решает проблему, я думал, что этот раздел предназначен для комментариев на стороне?   -  person JnRouvignac    schedule 03.08.2015


Ответы (3)


Я думаю, вам может понадобиться запросить атрибут jpegPhoto?

person JnRouvignac    schedule 31.07.2015

Каталог не хранит путь к изображению. Он хранит изображение.

Вы не удосужились упомянуть, какое сообщение об ошибке вы получили, или как далеко вы действительно зашли в этот код, что делает окончательный ответ невозможным, но атрибуты фотографий возвращаются в виде массивов байтов, а не строк, поэтому:

photo=(String)attrs.get("thumbnailPicture").get() ;

Если бы результат не имел такого атрибута, attrs.get("thumbnailPicture") вернул бы null, поэтому следующий .get() выдал бы NullPointerException. Если бы у него был такой атрибут и значение для него, вы бы получили ClassCastException при попытке привести byte[] к String. Единственный возможный вывод состоит в том, что эта строка кода не выполняется, поэтому photo остается в своем предыдущем значении, предположительно null, что и вызывает то поведение, которое вы наблюдаете, о котором вы не сказали нам, несмотря на многочисленные просьбы.

person user207421    schedule 31.07.2015
comment
Я не получаю сообщение об ошибке, иначе я бы добавил его! Мне нужен путь к файлу, так что это должна быть строка, верно? - person Noosrep; 02.08.2015
comment
Содержимое атрибута представляет собой двоичное изображение, а не путь. Вы так и не указали, в чем ваша проблема. - person user207421; 02.08.2015
comment
Обновил вопрос в надежде, что теперь стало понятнее - person Noosrep; 03.08.2015
comment
Я уже ответил на все это. Я не могу объяснить, почему вы ничего не получаете, но атрибут содержит изображение в байтах, а не путь. Упоминается ли thumbnailPicture в возвращаемых атрибутах в SearchControls? Я бы подумал, что вы получите NPE, если бы там действительно ничего не было. Строка attrs.get() действительно выполняется? - person user207421; 03.08.2015
comment
Да, строка выполняется, и вопрос по-прежнему заключается в том, чтобы узнать, есть ли способ узнать путь к файлу. Сохраняет ли OpenDJ его (поскольку он использует кнопку обзора). На мой взгляд, это должен быть даже не ответ, а комментарий к первоначальному вопросу. - person Noosrep; 03.08.2015
comment
Ответ по-прежнему заключается в том, что путь к файлу не находится в каталоге. Сколько раз точно это нужно повторять? Ответ также заключается в том, что если вы действительно выполнили attrs.get() для записи, у которой вообще не было атрибута thumbnailPhoto, я бы ожидал получить null от этого и NPE от следующего get(); если бы у него был такой атрибут со значением, я бы ожидал, что ClassCastException попытается преобразовать byte[] в String. Трудно поверить в ваше утверждение, что эта строка кода была выполнена, и это было так, вы до сих пор не сказали нам, что она дала. - person user207421; 03.08.2015
comment
Ваше недавнее редактирование — это первый раз, когда вы указали, что каталог не хранит путь, поэтому мне интересно, где вы берете повторную часть. Если бы ответ был таким в первый раз, когда он был опубликован, у нас не было бы этого ненужного разговора. - person Noosrep; 03.08.2015
comment
Мусор. Я указывал это трижды ранее в комментариях. Там написано черным по белому: содержимое атрибута представляет собой двоичное изображение, а не путь. Атрибут содержит изображение в байтах, а не имя пути. Путь к файлу не указан в каталоге. Вы даже не читаете то, что здесь написано. Поэтому разговор был излишним. - person user207421; 03.08.2015
comment
Сказать, что содержимое атрибута представляет собой двоичное изображение, не то же самое, что сказать, что каталог не содержит пути! В третий раз, наконец, было указано, что файл пути не находится в каталоге, и это тот, который я вижу как полезный комментарий/ответ. Вы говорите, что я даже не читаю то, что здесь написано, я предлагаю вам посмотреть на себя в будущем в отношении чтения исходного вопроса. - person Noosrep; 03.08.2015
comment
Больше мусора. «Не путь» содержится в моем первом комментарии выше, среди нескольких, которые вы не смогли прочитать и заявили, что не существуют. Я не могу вам помочь, если вы не понимаете простой английский, повторенный четыре раза. - person user207421; 05.08.2015
comment
И прочитайте мой пятый комментарий ниже. Мы можем продолжать в том же духе вечно, но правда все равно будет заключаться в том, что ответ в том виде, в каком он есть сейчас, намного лучше и яснее, чем ответ, который вы дали до многочисленных правок. Что даже не было ответом с самого начала. В любом случае я собираюсь сдаться, я никогда не видел кого-то настолько высокомерного на этом сайте, и я не собираюсь больше проводить с тобой время. Не стесняйтесь оставить за собой последнее слово, но могу я предложить вам выбрать мусор. Тебе это идет - person Noosrep; 06.08.2015

для изображения пользователя существует несколько атрибутов:

  1. thumbnailphoto (специально для Active Directory)
  2. jpegФото
  3. и фото

поэтому используйте следующие коды:

photo=(String)attrs.get("thumbnailPhoto").get() ;

or,

photo=(String)attrs.get("jpegPhoto").get() ;
person M2E67    schedule 09.08.2016