Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Listener method in p:fileUpload is never invoked in primefaces [duplicate]

I am trying to upload an image with primefaces and the fileUploadListener is not invoked.

<h:form enctype="multipart/form-data">

        <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
        mode="advanced" 
        update="messages"
        sizeLimit="100000" 
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>

<p:growl id="messages" showDetail="true"/>

here is the bean:

@ManagedBean
@RequestScoped
public class FileUploadController {
    public void handleFileUpload(FileUploadEvent event) throws Exception {
      System.out.println("OOOOOOOOOOOOOOOOOOK");
            File targetFolder = new File("C:/Uploads");
            InputStream inputStream = event.getFile().getInputstream();
            OutputStream out = new FileOutputStream(new File(targetFolder,
                    event.getFile().getFileName()));
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = inputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            inputStream.close();
            out.flush();
            out.close();  

    }
}

And here is the web.xml configuration:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
  <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

I have also added the commons-fileupload and Commons-io jars in the classpath. I am not understanding why the the handleFileUpload is not invoked.

like image 856
shark33 Avatar asked Mar 27 '13 12:03

shark33


1 Answers

You've explicitly configured the file upload filter to listen on FORWARD dispatcher only.

You need either to remove the following entry from the filter mapping so that it listens by default on the REQUEST dispatcher only:

<dispatcher>FORWARD</dispatcher>

Or, to add the REQUEST dispatcher to the filter mapping so that it would run on normal requests as well:

<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>

The FORWARD dispatcher is only mandatory when RequestDispatcher#forward() is been called before the filter is invoked. For example, by some URL rewriting solution such as PrettyFaces. The information provided so far in the question does however not seem to indicate in any way that you're using that.


Unrelated to the concrete problem, as the PrimeFaces file upload requires Apache Commons IO, you may want to consider to IOUtils#copy() instead of that verbose input/output stream loop. See also: How to save uploaded file in JSF.

like image 191
BalusC Avatar answered Oct 18 '22 12:10

BalusC