Конвертировать встроенные изображения в базу данных - PullRequest
4 голосов
/ 07 марта 2012

У меня «маленькая» проблема. В базе данных документы содержат поле richtext. Поле richtext содержит изображение профиля определенного контакта. Проблема в том, что этот контент не сохраняется как mime, и поэтому я не могу рассчитать URL изображения.

Я использую pojo для извлечения данных из профиля человека и использую их в своем элементе управления 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);

Ответы [ 3 ]

2 голосов
/ 09 апреля 2012

Прошло немного времени, и я не пошел по пути преобразования существующих данных в 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. Если это так, то предполагается несколько вещей:

  • Если в поле rtfield есть файлы, первый файл - это картинка для отображения
  • иначе он создаст указанный URL, если элемент имеет тип Rt, в противном случае он будет предполагать, что это объект MIME, и сгенерирует другой URL.
0 голосов
/ 06 марта 2013

Проблема не может быть решена «в идеале» в Java.

1) если вы конвертируете в MIME, вы испортили оригинальный форматированный текст Notes.MIME допускает только грустное приближение исходного контента;это может иметь или не иметь значения.

Если это имеет значение, можно преобразовать копию исходного поля в MIME, используемое только для отображения, или очистить его с помощью DXL и хранить отдельно - однако этот подход снова означаетпроблема синхронизации каждый раз, когда кто-либо меняет изображение в исходном элементе RT.

2) вычисление URL-адреса в соответствии с кодом OP в принятом самоответе вообще невозможно, так как константа 0.C4 в этом примере относитсясмещению изображения в двоичных данных элемента RT.То есть любой другой дизайн поля расширенного текста, введенные вручную изображения, созданные в другой версии Notes, - все это влияет на смещение.

3) URL может быть правильно вычислен только с использованием C API, который позволяет исследовать двоичные данные в элементе форматированного текста.Это не может быть сделано из Java.ИМО (без строительства мостов JNI и т. Д.)

0 голосов
/ 21 марта 2012

Не уверен, что это ответ, но я пока не могу добавлять комментарии. Вы убедились, что в вашем потоке что-то есть?

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

...