我想使用标准XPages xp:fileDownload控件并将其绑定到Java Bean而不是文档源。
我的表单中有一个RTF字段 - “resourceAttachments” - 以及其他几个字段,其中我将存储多个附件而不是其他字段。
任何人都可以向我提供一些示例或指向我一些文档。我对xp:uploadControl有类似的要求,我可以找到创建新文档的示例,但是我很难实现添加和保存到现有文档,我想我应该发布另一个问题,但是当两个去我以为我至少会在这里提到它。
非常感谢。
标记
public class TrainingModule implements Serializable {
private static final long serialVersionUID = -6998234266563204541L;
private String description;
private ???? resourceAttachments; --something here ??
private String unid;
public TrainingModule() {
String documentId = ExtLibUtil.readParameter(FacesContext.getCurrentInstance(), "key");
if (StringUtil.isNotEmpty(documentId)) {
load(documentId);
}
}
public String getUnid() {return unid;}
public void setUnid(final String unid) {this.unid = unid;}
public String getDescription() {return description;}
public void setDescription(final String description) {this.description = description;}
? Some attachment Getter & Setter here??
public void load(final String unid) {setUnid(unid);{
Document doc = null;
try {
doc = ExtLibUtil.getCurrentDatabase().getDocumentByUNID(getUnid());
setDescription(doc.getItemValueString("Description"));
??Some load here here??
} catch (Throwable t) { t.printStackTrace();
} finally {
try {
doc.recycle();
?some other recycle here?
} catch (Exception ) {
// Fail Silent
}
}
在我的自定义控制中,我有其他的东西......
<xp:this.beforePageLoad><![CDATA[#{javascript:if(param.containsKey("key"))
{viewScope.put("docAttach",(param.get("key")));}}]]></xp:this.beforePageLoad>
.......
<xp:fileDownload rows="30" id="fileDownload2" displayLastModified="false"
value="#{TrainingModule.ResourceAttachments}" hideWhen="true" allowDelete="true">
</xp:fileDownload>
答案 0 :(得分:0)
我去年遇到过类似的问题。我没有为fileUpload寻找合适的绑定。相反,我使用了不同的方法。
当您提交带有文件上载的XPage时,它会将文件上传到磁盘(无论是否有任何绑定),并在com.ibm.xsp.http.UploadedFile
中创建requestMap
对象。所以你可以从bean方法中获取它并做一些魔术。
这是IBM Connect 2014演示,我使用此技术将文件上传到BaseCamp。
XSP代码很简单(here is the Github repo)
<xp:fileUpload id="fileUpload1"></xp:fileUpload>
<xp:button id="button1"
value="Upload Local File">
<xp:eventHandler event="onclick"
submit="true" refreshMode="complete">
<xp:this.action>
<xp:executeScript
script="#{bcs.uploadLocalFile}">
</xp:executeScript>
</xp:this.action>
</xp:eventHandler>
</xp:button>
bcs
是托管bean,这是上传的代码段(from Github repo)
public void uploadLocalFile() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
String fileUploadID = ExtLibUtil.getClientId(facesContext, facesContext.getViewRoot(), "fileUpload1", false);
UploadedFile uploadedFile = ((UploadedFile) request.getParameterMap().get(fileUploadID));
if (uploadedFile == null) {
facesContext.addMessage("messages1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "No file uploaded. Use the file upload button to upload a file.", ""));
return;
}
java.io.File file = uploadedFile.getServerFile();
String contentType=uploadedFile.getContentType();
String fileName = uploadedFile.getClientFileName();
// removed unrelated code...
}
所以,基本上,你得到了requestMap
。 UploadedFile
对象引用已上载到服务器上的临时区域的文件对象,并使用clientId
组件的fileUpload
进行映射。
在此之后,您可以创建一个流并将该文件附加到字段中。当你将它绑定到一个字段时,我想文档包装器会做同样的事情。