У меня есть API-интерфейс NodeJS / Express RESTful, который передает запросы от сервера LDAP Active Directory. Я делаю это, потому что запросы LDAP имеют тенденцию быть медленными. Я использую RESTful API для периодического кэширования и обновления данных. Я недавно попытался добавить миниатюру фото. В исследовании выяснилось, что библиотека, которую я использую ldapjs, конвертирует собственный байтовый массив ldap в строку.
Пример того, как это выглядит:
\ ufffd \ ufffd \ ufffd \ ufffd \ u0000 \ u0010JFIF \ u0000 \ u0001 \ u0000 \ u0001 \ u0000x \ u0000x \ u0000 \ u0000 \ ufffd \ ufffd \ u0000 \ u001fLEAD
Технологии Inc.
V1.01 \ u0000 \ ufffd \ ufffd \ u0000 \ ufffd \ u0000 \ u0005 \ u0005 \ u0005 \ Ь \
Из-за этого изображение неправильно отображается в угловом клиентском приложении. Итак, основываясь на моих исследованиях, вот несколько попыток исправить эту проблему:
Преобразование строки в байтовый массив с использованием различных методов (см. Примеры кода)
Измените библиотеку ldapjs для отображения данных в виде байтового массива в RESTFUL, как показано ниже, затем привяжите поток байтов к угловой странице:
HTML-привязка:
<div>
<img *ngIf="userImage" [src]="userImage" alt="{{dataSource.sAMAccountName}}">
</div>
Контроллер:
public get userImage() {
let value = null;
if(this.dataSource.thumbnailPhoto) {
const byteArray = this.string2Bin(this.dataSource.thumbnailPhoto);
const image = `data:image/jpeg;base64,${Buffer.from(byteArray).toString('base64')}`;
value = this.domSanitizer.bypassSecurityTrustUrl(image);
}
return value;
}
private string2Bin(str) {
var result = [];
for (var i = 0; i < str.length; i++) {
result.push(str.charCodeAt(i));
}
return result;
}
и
альтернативная версия контроллера:
public get userImage() {
let value = null;
if(this.dataSource.thumbnailPhoto) {
const byteArray = new TextEncoder().encode(this.dataSource.thumbnailPhoto);
const image = `data:image/jpeg;base64,${Buffer.from(byteArray).toString('base64')}`;
value = this.domSanitizer.bypassSecurityTrustUrl(image);
}
return value;
}
другая альтернативная версия контроллера:
public get userImage() {
let value = null;
if(this.dataSource.thumbnailPhoto) {
const blob = new Blob( [Buffer.from(this.dataSource.thumbnailPhoto).toString('base64')], { type: 'image/jpeg' } );
const value = window.URL.createObjectURL(blob);
return value;
}
Я ожидал визуализированного изображения на угловой странице, но все, что я получаю, это не визуализированный заполнитель.
Вот версии библиотек, которые я использую
- Угловой - 8.0.3
- NodeJS - 10.15.0
- ldapjs - 1.0.2
Я уверен, что что-то упустил, я просто не уверен, что это такое. Любая помощь будет оценена.