2012-03-29 44 views
0

我有一个简单的表单和正文字段。当用户上传附件时,我想删除文档正文字段中的任何附件。我如何在保存按钮中执行此操作。上传新附件时替换附件

我试图在FileUpload控件设置的性质在以随时更改文件名塔相同的名字,但这并不替换该文件,而是增加了一个新的文件,添加一个新的序列号,它

<xp:fileUpload id="fileUpload1" value="#{userdoc.Body}" filename="profile"  seUploadname="false"></xp:fileUpload> 

我还试图在保存之前循环所有嵌入的附件在body字段中,然后删除所有附件,但不添加我的新附件。

+0

因为它已经在该阶段附加了新文件。因此,您也正在删除我认为最后附加的文件(您可能会在删除前测试它打印附件名称)。 – 2012-03-29 13:06:15

回答

3

这可以通过首先删除所有附件(使用NotesXSPDocument对象中的removeAllAttachments函数),然后手动将上载的文件附加到richtext项来完成。

这SSJS代码已被添加到XPage的beforeRenderResponse事件/自定义控制:

var con = facesContext.getExternalContext(); 
var request:com.sun.faces.context.MyHttpServletRequestWrapper = con.getRequest(); 
var map:java.util.Map = request.getParameterMap(); 
var fileDataName = getClientId('fileUpload1') ; 
var fileData:com.ibm.xsp.http.UploadedFile = map.get(fileDataName); 
if(fileData == null){ 
    return; 
} 

var tempFile:java.io.File = fileData.getServerFile(); 
var correctedFile = new java.io.File(tempFile.getParentFile().getAbsolutePath() + 
    java.io.File.separator + fileData.getClientFileName()); 

var success = tempFile.renameTo(correctedFile); 
try{ 
    document1.removeAllAttachments("Body"); 
}catch(e){} 

var rtFiles:NotesRichTextItem = null; 
if(!(document1.getDocument().hasItem("Body"))){ 
    rtFiles = document1.getDocument().createRichTextItem("Body") 
}else{ 
    rtFiles = document1.getDocument().getFirstItem("Body"); 
} 
rtFiles.embedObject(lotus.domino.local.EmbeddedObject.EMBED_ATTACHMENT, "", 
    correctedFile.getAbsolutePath(), null); 
correctedFile.renameTo(tempFile); 

document1.save(); 

在文件存储的富文本项是“身体”,数据源的名称为“文档1 ”。 Fileupload控件是“fileUpload1”。

有两个限制:

  1. 你不能保存按钮使用这个,你必须使用一个普通按钮/链接,这使得完全刷新(看什么的Serdar Basegmez上面写的)
  2. 你必须在再次上传后刷新页面,否则在文件下载控制中不会看到上传的文件(也许可以对该控件进行局部刷新)。

编辑:

对不起,我的错:您可以使用上面这段代码的提交按钮,保存文档。那么你不要必须手动刷新页面!

+0

不错。将尝试 – 2012-03-29 18:00:37

+0

它工作?或不? – 2012-06-08 04:21:43

7

有点晚了,但万一有人送过来,就像我通过谷歌没有...

还有另一种选择:一个NotesXSPDocument.getAttachmentList(“rtitem”)返回文档中的附件列表。每个条目的类型为DominoDocument.AttachmentValueHolder,它具有getState()属性,该属性在文件已经在文档中或刚添加时返回。要删除已经在文档中,你可以这样SSJS代码添加到保存按钮的文件(假设“文件”是富文本项目持有的名称文件):删除附件保存之前没有

var attList = docFile.getAttachmentList("files"); 

for(var i=0; i<attList.size(); i++) { 
    var att = attList.get(i); 

    if (att.getState()==0) {  //STATE_INDOCUMENT: this is the 'old' file: remove it 
    docFile.removeAttachment("files", att.getName()); 
    } else if (att.getState()==1) {  //STATE_ADDED: this is the new file 
      //leave it   
    } 
} 
+1

不错的thx,非常有用..这也适用于'xp:fileUpload'onChange事件。 – 2013-07-22 10:34:09