在XPage中使用Java Bean的文件下载控件

时间:2014-11-19 15:55:18

标签: xpages

我想使用标准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>

1 个答案:

答案 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...

}

所以,基本上,你得到了requestMapUploadedFile对象引用已上载到服务器上的临时区域的文件对象,并使用clientId组件的fileUpload进行映射。

在此之后,您可以创建一个流并将该文件附加到字段中。当你将它绑定到一个字段时,我想文档包装器会做同样的事情。