0

JSF 2.2 - Primefaces 4.0 - JBoss Wildfly

Hi, I am trying to pass a parameter value to the file upload handler. I tried a few suggestions I found, but can't get it to work.

I stepped a few steps back

I need the #{fileUploadController.newItemId} in the controller

When going to the file update page it is done with i.e. this URL /fileUpload.jsf?newItemId=10

I tried what it mentioned in How to send parameter to fileUploadListener in PrimeFaces fileUpload and Passing 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;
    }
}
Community
  • 1
  • 1
klind
  • 855
  • 2
  • 21
  • 33
  • 3
    What is newItemId and where is it coming from ? – Adarsh Jan 15 '14 at 07:49
  • Passing parameter to the event handler is not possible. Just accepts PF FileUpload event. Apart from that you say you need `#{fileUploadController.newItemId}`, but don't you already have it? – Aritz Jan 15 '14 at 08:03

1 Answers1

0

I just found that my controller was only request scoped, after changing it to

@ViewScoped @Named public class FileUploadController implements Serializable

I of cause still have the item id, and can now add images to that item.

Thanks for the comments guys

klind
  • 855
  • 2
  • 21
  • 33