Java 在数据库中转换嵌入的图片

Java 在数据库中转换嵌入的图片,java,mime-types,mime,lotus-notes,xpages,Java,Mime Types,Mime,Lotus Notes,Xpages,我有一个“小”问题。在数据库中,文档包含richtextfield。richtextfield包含某个联系人的个人资料图片。问题是,该内容没有保存为mime,因此我无法计算图像的url 我正在使用pojo从person配置文件中检索数据,并在xpage控件中使用它来显示其内容。我需要构建一个转换代理,它接受richtextitem的内容并将其转换为mime,以便能够计算url,比如 http://host/database.nsf/($users)/D40FE4181F2B86CCC12579A

我有一个“小”问题。在数据库中,文档包含richtextfield。richtextfield包含某个联系人的个人资料图片。问题是,该内容没有保存为mime,因此我无法计算图像的url

我正在使用pojo从person配置文件中检索数据,并在xpage控件中使用它来显示其内容。我需要构建一个转换代理,它接受richtextitem的内容并将其转换为mime,以便能够计算url,比如

http://host/database.nsf/($users)/D40FE4181F2B86CCC12579AB0047BD22/Photo/M2?OpenElement
有人能帮我把richtextitem的内容转换成mime吗?在rt字段中检查嵌入对象时,没有任何对象。当我获取字段的内容作为流并使用以下代码将其保存到新的richtext字段时。但新的领域并不是以某种方式创造出来的

System.out.println("check if document contains a field with name "+fieldName);
        if(!doc.hasItem(fieldName)){
            throw new PictureConvertException("Could not locate richtextitem with name"+fieldName);
        }


        RichTextItem pictureField = (RichTextItem) doc.getFirstItem(fieldName);

        System.out.println("Its a richtextfield..");
        System.out.println("Copy field to backup field");

        if(doc.hasItem("old_"+fieldName)){

            doc.removeItem("old_"+fieldName);

        }


        pictureField.copyItemToDocument(doc, "old_"+fieldName);     

//      Vector embeddedPictures = pictureField.getEmbeddedObjects();
//      System.out.println(doc.hasEmbedded());
//      System.out.println("Retrieved embedded objects");
//      if(embeddedPictures.isEmpty()){
//          throw new PictureConvertException("No embedded objects could be found.");
//      }
//      


//      EmbeddedObject photo = (EmbeddedObject) embeddedPictures.get(0);
        System.out.println("Create inputstream");

        //s.setConvertMime(false);
        InputStream iStream = pictureField.getInputStream();
        System.out.println("Create notesstream");
        Stream nStream = s.createStream();
        nStream.setContents(iStream);

        System.out.println("Create mime entity");

        MIMEEntity mEntity = doc.createMIMEEntity("PictureTest");
        MIMEHeader cdheader = mEntity.createHeader("Content-Disposition");
        System.out.println("Set header withfilename picture.gif");

        cdheader.setHeaderVal("attachment;filename=picture.gif");
        System.out.println("Setcontent type header");
        MIMEHeader cidheader = mEntity.createHeader("Content-ID");
        cidheader.setHeaderVal("picture.gif");
        System.out.println("Set content from stream");
        mEntity.setContentFromBytes(nStream, "application/gif", mEntity.ENC_IDENTITY_BINARY);
        System.out.println("Save document..");

        doc.save();
        //s.setConvertMime(true);


        System.out.println("Done");

        // Clean up if we are done..

        //doc.removeItem(fieldName);

不确定这是否是一个答案,但我似乎还不能添加评论。您是否验证了流中存在某些内容

if(stream.getBytes()!=0){

已经有一段时间了,我没有将现有数据转换为mime。我无法让它工作,经过更多的研究后,它似乎没有必要。因为问题是显示绑定到richtextbox的图像,我研究了如何计算图像的url,并提出了以下建议以下代码行:

function getImageURL(doc:NotesDocument, strRTItem,strFileType){
    if(doc!=null && !"".equals(strRTItem)){
        var rtItem = doc.getFirstItem(strRTItem);
        if(rtItem!=null){
            var personelDB = doc.getParentDatabase();
            var dbURL = getDBUrl(personelDB);
            var imageURL:java.lang.StringBuffer = new java.lang.StringBuffer(dbURL);

            if("file".equals(strFileType)){
                var embeddedObjects:java.util.Vector = rtItem.getEmbeddedObjects();
                if(!embeddedObjects.isEmpty()){
                    var file:NotesEmbeddedObject = embeddedObjects.get(0); 

                    imageURL.append("(lookupView)\\");
                    imageURL.append(doc.getUniversalID());
                    imageURL.append("\\$File\\");
                    imageURL.append(file.getName());
                    imageURL.append("?Open");

                }
            }else{              
                imageURL.append(doc.getUniversalID());
                imageURL.append("/"+strRTItem+"/");
                if(rtItem instanceof lotus.domino.local.RichTextItem){
                    imageURL.append("0.C4?OpenElement");
                }else{
                    imageURL.append("M2?OpenElement");
                }
            }
            return imageURL.toString()
        }
    }
}
它将检查给定的RT字段是否存在。如果是这种情况,它将假设以下几点:

  • 如果RTF字段中有文件,则第一个文件是要显示的图片
  • 否则,它将创建一个指定的url,如果该项的类型为Rt Other,那么它将假定它是一个mime实体,并将生成另一个url

    • 这个问题在Java中无法“理想地”解决

      1) 如果你转换成MIME,你会把原始的Notes富文本搞砸。MIME只允许原始内容的近似值;这可能有问题,也可能没有问题

      如果重要的话,可以将原始字段的副本转换为仅用于显示目的的MIME,或者使用DXL将其刮出并单独存储-但是这种方法再次意味着每当有人更改原始RT项中的图像时都会出现同步问题

      2) 通常不可能根据接受的自我回答中的操作码计算URL,因为本例中的常数0.C4与RT项目二进制数据中图像的偏移量有关。这意味着任何其他富文本字段设计,手动输入的图像,由不同版本的注释创建-都会影响偏移量


      3) 只有使用允许调查富文本项中的二进制数据的C API才能正确计算url。这不能从Java.IMO中完成(不构建JNI桥等)

      您是否尝试将RT字段更改为mime并重新保存文档?是的,当我手动执行时,这会起作用。但是有+/-200个文档,我不想保存并关闭它们,如果不需要;)您可以执行doc.computewithform(…)然后保存它们,然后访问java代码中的mime数据?我还没有测试过这一点,如果您可以在手动保存文档时访问url,我看不出有任何理由不能以编程方式进行操作。