File upload 上载新附件时替换附件

File upload 上载新附件时替换附件,file-upload,save,xpages,xsp,File Upload,Save,Xpages,Xsp,我有一个简单的表单和body字段。当用户上传附件时,我希望删除文档正文字段中已有的任何附件。如何在“保存”按钮中执行此操作 我尝试在fileUpload控件上设置属性,使其始终将文件名更改为相同的名称,但这不会替换文件,而是会添加一个新文件并向其添加一个新的序列号 <xp:fileUpload id="fileUpload1" value="#{userdoc.Body}" filename="profile" seUploadname="false"></xp:fil

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

我尝试在fileUpload控件上设置属性,使其始终将文件名更改为相同的名称,但这不会替换文件,而是会添加一个新文件并向其添加一个新的序列号

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


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

这可以通过先删除所有附件来完成(使用NotesXPDocument对象中的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();
存储文件的richtext项是“Body”,数据源的名称是“document1”。Fileupload控件是“fileUpload1”

有两个限制:

  • 您不能将其与保存按钮一起使用,您必须使用一个正常的按钮/链接来进行完全刷新(请参阅上面Serdar Basegmez所写的内容)
  • 您必须在再次上载后刷新页面,否则您将无法在文件下载控制中看到上载的文件(可能对此控制进行部分刷新)
  • 编辑:


    对不起,我的错:您可以在保存文档的提交按钮中使用上述代码。那么你就不必手动刷新页面了

    有点晚了,但万一有人像我通过谷歌那样来这里

    还有另一个选项:notesxpdocument.getAttachmentList(“rtitem”)返回文档中的附件列表。每个条目的类型都有一个getState()属性,如果文档中已经存在或刚刚添加了文件,则返回该属性。要删除文档中已有的文件,可以将此SSJS代码添加到保存按钮(假设“files”是保存文件的richtext项的名称):

    var attList=docFile.getAttachmentList(“文件”);
    
    对于(var i=0;保存前删除附件不起作用,因为它在该阶段附加了新文件。因此,我猜您也在删除最后附加的文件(您可能会在删除前测试它打印附件名称)。很好的thx,非常有用。。这在“xp:fileUpload”上的onChange事件中也起作用。
    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           
      } 
    }