2012-03-29 96 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