0

我有一个代理来自 Active Directory LDAP 服务器的请求的 NodeJS / Express RESTful API。我这样做是因为 LDAP 查询往往很慢。我使用 RESTful API 间歇性地缓存和刷新数据。我最近尝试添加缩略图。在研究中,我使用 ldapjs 的库似乎正在将本机 ldap 字节数组转换为字符串。

这看起来像的例子:

\ufffd\ufffd\ufffd\ufffd\u0000\u0010JFIF\u0000\u0001\u0000\u0001\u0000x\u0000x\u0000\u0000\ufffd\ufffd\u0000\u001fLEAD Technologies Inc. V1.01\u0000000ufffd\ufffd\u \ufffd\u0000\u0005\u0005\u0005\b\

由于这个事实,图像无法在 Angular 客户端应用程序上正确呈现。所以根据我的研究,这里有一些纠正这个问题的尝试:

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

我确定我错过了一些东西,我只是不确定它是什么。任何援助将不胜感激。

4

1 回答 1

0

因此,在@Aritra Chakraborty 提供一些指导后,我检查了 RESTful api 源代码。这似乎是 ldapjs 库的问题。当使用入口对象转换时,它对不可用的数据做了一些奇怪的事情。然后我意识到,我可以访问条目原始格式,即字节数组。我没有尝试在客户端转换为 base64,而是将其移至 API。然后只需将其映射回客户端绑定并砰它工作。

这是一些示例代码:

RESTful api

_client.search(this._search_dn, opts, (error, res) => {
          res.on("searchEntry", (entry) => {

            let result = {};

            result.id = string_service.formatGUID(JSON.parse(JSON.stringify(entry.raw)).objectGUID);
            result = Object.assign({}, result, entry.object);
            if(entry.raw.thumbnailPhoto) {
              result.thumbnailPhoto = entry.raw.thumbnailPhoto.toString('base64');
            }
// The previous 3 lines did not exist previously

在 Angular 8 客户端上,我简化了绑定:

public get userImage() {
  let value = null;
  if(this.dataSource.thumbnailPhoto) {
    const image = `data:image/jpeg;base64,${this.dataSource.thumbnailPhoto}`;
    value = this.domSanitizer.bypassSecurityTrustUrl(image);
  }
  return value;
}

我希望有人能从中找到一些价值。

于 2019-07-03T18:07:41.560 回答