JSF Primefaces将参数传递给fileupload

时间:2014-01-15 07:34:03

标签: jsf jsf-2 primefaces

JSF 2.2 - Primefaces 4.0 - JBoss Wildfly

嗨,我正在尝试将参数值传递给文件上传处理程序。 我尝试了一些我发现的建议,但无法让它发挥作用。

我退了几步

我需要控制器中的#{fileUploadController.newItemId}

当进入文件更新页面时,即使用此URL完成 /fileUpload.jsf?newItemId=10

我尝试了它提到的内容 How to send parameter to fileUploadListener in PrimeFaces fileUploadPassing value to the backing bean with PrimeFaces file upload

fileUpload.xhtml

 <f:metadata>
                <f:viewParam name="newItemId"
                    value="#{fileUploadController.newItemId}" />
                <f:viewAction action="#{fileUploadController.loadData()}" />
            </f:metadata>
            <h:form id="item" enctype="multipart/form-data">
                <p:messages id="messages" />

                <p:panelGrid styleClass="panelGridCenter">
                    <p:row>
                        <p:column>
                            <p:fileUpload
                                fileUploadListener="#{fileUploadController.handleFileUpload}"
                                validator="#{fileUploadController.validateFile}" mode="advanced"
                                dragDropSupport="false" update="messages" sizeLimit="1000000"
                                fileLimit="100" allowTypes="/(\.|\/)(gif|jpe?g|png)$/">

                            </p:fileUpload>
                        </p:column>
                    </p:row>
                </p:panelGrid>

            </h:form>

FileUploadController.java

public void handleFileUpload(FileUploadEvent event) {
        try {

            // Need item id here :) 

            UploadedFile file = event.getFile();
            InputStream inputStream = file.getInputstream();
            FileOutputStream outputStream = new FileOutputStream(file.getFileName());
            byte[] buffer = new byte[4096];
            int bytesRead = 0;
            while (true) {
                bytesRead = inputStream.read(buffer);
                if (bytesRead > 0) {
                    outputStream.write(buffer, 0, bytesRead);
                } else {
                    break;
                }
            }
            outputStream.close();
            inputStream.close();
            Long imageId = serviceSLSB.saveImage(itemId, file, buffer);
            FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded and saved with id." + imageId);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (Exception e) {
            String errorMessage = getRootErrorMessage(e);
            FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, "Saving unsuccessful");
            facesContext.addMessage(null, m);
        } 
    }

public void loadData() {
    if (newItemId == null) {
        String message = "Bad request. Please use a link from within the system.";
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
        return;
    } else {
        String message = "Your are adding images to item with id : " + newItemId;
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, null));
        return;
    }
}

1 个答案:

答案 0 :(得分:0)

我刚刚发现我的控制器只是在将其更改为

后请求作用域

@ViewScoped @Named 公共类FileUploadController实现Serializable

我的原因仍然是项目ID,现在可以添加图像到该项目。

感谢评论人员