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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With