Заменить вложение при загрузке нового вложения - PullRequest
0 голосов
/ 29 марта 2012

У меня есть простая форма и поле тела. когда пользователь загружает вложение, я хочу удалить любое вложение, уже находящееся в поле тела документа. как я могу сделать это в моей кнопке сохранения.

Я попытался установить свойства в элементе управления fileUpload, чтобы всегда изменять имя файла на то же имя, но это не заменяет файл, вместо этого он добавляет новый файл и добавляет к нему новый порядковый номер

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

Я также пытался зациклить все вложенные вложения в поле тела перед сохранением, а затем все вложения удаляются, но мое новое вложение не добавляется.

Ответы [ 2 ]

7 голосов
/ 13 августа 2012

Немного поздно, но в случае, если кто-то попадет сюда так же, как я это сделал через Google ...

Есть и другой вариант: NotesXSPDocument.getAttachmentList ("rtitem") возвращает список вложений в документе,Каждая запись имеет тип DominoDocument.AttachmentValueHolder , которая имеет свойство getState (), которое возвращает, если файл уже был в документе или только что добавлен.Чтобы удалить файл, который уже был в документе, вы можете добавить этот код SSJS к кнопке сохранения (при условии, что «файлы» - это имя элемента richtext, содержащего файлы):

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           
  } 
}
3 голосов
/ 29 марта 2012

Это можно сделать, сначала удалив все вложения (используйте функцию removeAllAttachments из объекта NotesXSPDocument), а затем прикрепите загруженный файл вручную к элементу richtext.

Этот код SSJS должен быть добавлен к beforeRenderResponse-событию вашего XPage / Custom Control:

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, в котором хранятся файлы, - это «Тело», имя источника данных - «document1». Элемент управления Fileupload - «fileUpload1».

Есть два ограничения:

  1. Вы не можете использовать это с кнопкой сохранения, вы должны использовать обычную кнопку / ссылку, которая выполняет полное обновление (смотрите, что Serdar Basegmez написал выше)
  2. Вы должны обновить страницу после загрузки еще раз, в противном случае вы не увидите загруженный файл в контроле загрузки файлов (возможно, будет работать частичное обновление этого элемента управления).

EDIT:

Извините, я виноват: вы можете использовать этот код выше в кнопке отправки, которая сохраняет документ. Тогда вам не нужно обновлять страницу вручную!

...