我有一个'小'的问题。在数据库文档中包含richtextfield。 richtextfield包含某个联系人的个人资料图片。问题是这个内容没有保存为mime,因此我无法计算图像的url。
我正在使用pojo从个人资料中检索数据,并在我的xpage控件中使用它来显示其内容。我需要构建一个转换代理,它接受richtextitem的内容并将其转换为mime,以便能够计算类似
的URLhttp://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);
答案 0 :(得分:2)
现在已经有一段时间了,我没有沿着将现有数据转换为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字段。如果是这种情况,它会假设一些事情:
答案 1 :(得分:0)
不确定这是否是答案,但我似乎还无法添加评论。您是否确认过您的信息流中有什么内容?
if (stream.getBytes() != 0) {
答案 2 :(得分:0)
这个问题无法在Java中“理想地”解决。
1)如果你转换为MIME,你搞砸了原始的Notes富文本。 MIME仅允许对原始内容进行悲伤的近似;这可能或不重要。
如果重要,可以将原始字段的副本转换为仅用于显示目的的MIME,或者使用DXL将其删除并单独存储 - 但是这种方法再次意味着每次有人更改原始RT项目中的图像时都会同步。
2)通常不可能根据接受的自答案中的OP代码计算URL,因为该示例中的常数0.C4涉及RT项的二进制数据中的图像的偏移。这意味着富文本字段的任何其他设计,手动输入的图像,由不同版本的Notes创建 - 都会影响偏移量。
3)只有使用允许调查富文本项中二进制数据的C API才能正确计算网址。这不能通过Java完成。 IMO(没有建立JNI桥梁等)