2012-03-07 2 views
4

J'ai un «petit» problème. Dans une base de données, les documents contiennent un champ de texte riche. Le champ richtext contient une image de profil d'un certain contact. Le problème est que ce contenu n'est pas enregistré comme mime et donc je ne peux pas calculer l'URL de l'image.Convertir des images incorporées dans la base de données

J'utilise un pojo pour récupérer des données du profil de la personne et l'utiliser dans mon contrôle xpage pour afficher son contenu. Je dois construire un agent de conversion qui prend le contenu de la richtextitem et la convertit en mime pour pouvoir calculer quelque chose url comme

http://host/database.nsf/($users)/D40FE4181F2B86CCC12579AB0047BD22/Photo/M2?OpenElement 

Quelqu'un pourrait-il me aider à convertir le contenu du richtextitem à mimer? Lorsque je vérifie les objets incorporés dans le champ rt, il n'y en a pas. Lorsque j'obtiens le contenu du champ en tant que flux et que je l'enregistre dans un nouveau champ richtext en utilisant le code suivant. Mais le nouveau champ n'est pas créé en quelque sorte.

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); 
+0

Avez-vous essayé de changer le champ RT pour mimer et ré-enregistrer les documents? –

+1

Oui, cela fait l'affaire quand je le fais manuellement. Mais il y a +/- 200 documents et je ne veux pas enregistrer et les fermer par et si je n'ai pas besoin;) – jjtbsomhorst

+0

Pouvez-vous faire doc.computewithform (...) et les enregistrer, et après cela accéder aux données mime dans votre code java? –

Répondre

2

Son été un peu de temps maintenant et je ne suis pas allé dans la voie de la conversion des données existantes au mime. Je ne pouvais pas le faire fonctionner et après d'autres recherches, cela semblait inutile. Parce que la question est sur le point d'afficher des images liées à un richtextbox je l'ai fait des recherches sur la façon de calculer l'URL d'une image et je suis venu avec les lignes de code suivantes:

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

Il vérifie si un champ RT donné est présent. Si tel est le cas, il suppose un certain nombre de choses:

  • Si des fichiers dans le rtfield le premier fichier est l'image pour afficher
  • sinon il va créer une URL spécifiée si l'élément est de type Rt otherwhise il supposera que c'est une entité mime et va générer une autre URL.
0

Je ne sais pas si c'est une réponse, mais je ne peux pas ajouter de commentaires pour le moment. Avez-vous vérifié qu'il y a quelque chose dans votre flux?

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

0

Le problème ne peut pas être résolu "idéalement" en Java. 1) Si vous convertissez en MIME, vous bousiller le texte riche original de Notes. MIME permet seulement une approximation triste du contenu original; Cela pourrait ou ne pas avoir d'importance.

S'il importe, il est possible de convertir une copie du champ d'origine à MIME utilisé uniquement à des fins d'affichage, ou gratter à l'aide DXL et stocker séparément - mais cette approche signifie à nouveau un problème de synchronisation chaque fois que quelqu'un modifie l'image dans l'élément RT original. 2) calculer l'URL selon le code OP dans la réponse automatique acceptée n'est pas possible en général car la constante 0.C4 dans cet exemple concerne le décalage de l'image dans les données binaires de l'élément RT. Ce qui signifie toute autre conception de champ de texte enrichi, les images saisies manuellement, créées par une version différente de Notes - tous influencent le décalage. 3) l'URL peut être calculée correctement uniquement en utilisant l'API C qui permet d'étudier les données binaires dans un élément de texte enrichi. Cela ne peut pas être fait à partir de Java. IMO (sans construire de ponts JNI etc)

Questions connexes