【问题标题】:Retrieve picture from OpenDJ ldap via Java通过 Java 从 OpenDJ ldap 检索图片
【发布时间】:2015-07-31 14:57:59
【问题描述】:

我已通过 OpenDJ 控制面板向用户添加了一张图片,但我似乎无法检索该图片,因此我可以在网页上显示它。我找到了两个属性 thumbnailPicturephoto 并尝试通过以下方式访问它:

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() ;

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

我注意到当通过 OpenDJ 控制面板添加图片时,它会通过浏览按钮进行,所以我猜路径应该存储在某个地方?

我没有收到任何错误消息(我想是因为属性 thumbnailPicturephoto 没有在 OpenDJ 中填写,所以它们返回为空)但是我会比如:

  • 保存图片的路径,但这只是猜测 OpenDJ 实际上存储了这些信息?
  • 可以检索图片,但我不确定它在 OpenDJ 中保存的内容。现在的代码用于文件的路径(这就是为什么要转换为 String)。

【问题讨论】:

  • 对你在文中提到“thumbnailPicture and photo”感到困惑,但代码显示“thumbnailPhoto”?
  • 另外,您正在使用 JNDI。为什么不使用更现代的 OpenDJ SDK?
  • @JnRouvigac JNDI 有效,您为什么不使用它? LDAP 协议没有改变。
  • JNDI 确实有效,但 API 不是很好。使用它的代码笨拙且难以阅读。
  • @JnRouvigac 你是对的,如果我不使用正确的属性,它就不会起作用..

标签: java ldap jndi opendj


【解决方案1】:

我想您可能需要询问jpegPhoto 属性?

【讨论】:

    【解决方案2】:

    该目录不存储图像的路径。它存储图像。

    您不必费心提及您收到的错误消息,或者您真正进入该代码的程度,这使得无法给出明确的答案,但照片属性以字节数组而不是字符串的形式返回,所以:

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

    如果结果没有这样的属性,attrs.get("thumbnailPicture") 会返回 null,所以下面的.get() 会抛出一个NullPointerException。如果它确实有这样一个属性和一个值,你会从尝试将byte[] 转换为String. 得到ClassCastException 唯一可能的结论是这行代码没有被执行,所以@ 987654328@ 保持其之前的值,大概是null,这会导致您观察到的任何行为,尽管有很多请求,您都没有告诉我们。

    【讨论】:

    • 我没有收到错误消息,否则我会添加它!我需要文件的路径,所以它应该是一个字符串吧?
    • 属性的内容是二进制图片,不是路径。您还没有说明您的实际问题是什么。
    • 更新了问题,希望现在更清楚
    • 我已经回答了这一切。我无法解释为什么您什么也得不到,但该属性包含图片,以字节为单位,而不是路径名。 thumbnailPicture 是否在 SearchControls 的返回属性中提到?如果那里真的什么都没有,我会认为你会获得 NPE。 attrs.get() 行真的执行了吗?
    • 是的,该行执行,问题仍然是知道是否有办法找出文件的路径。 OpenDJ 是否存储它(因为它使用浏览按钮)。在我看来,这甚至不应该是一个答案,而是作为对最初问题的评论
    【解决方案3】:

    对于用户图像,存在几个属性:

    1. thumbnailphoto(特别是来自 Active Directory)
    2. jpeg照片
    3. 和照片

    所以使用以下代码:

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

    或者,

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

    【讨论】:

      【解决方案4】:

      我使用下面的代码将 thumbnailPhoto 写入文件

          NamingEnumeration<SearchResult> results = ctx.search(base, filter, sc);
          // while (results.hasMore()) {
          SearchResult sr = (SearchResult) results.next();
          Attributes attrs = sr.getAttributes();
          Attribute attr = attrs.get("thumbnailPhoto"); 
        
          byte[] image =(byte[]) attr.get();       
      
          ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutputStream out = new ObjectOutputStream(bos) ;
         out.writeObject(result);
      
          Path path = Paths.get("output.jpg");
          try {
              Files.write(path,  image);    // Java 7+ only
              System.out.println("Successfully written data to the file");
          }
          catch (IOException e) {
              e.printStackTrace();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        相关资源
        最近更新 更多