jsf - example - Método de escucha en p: fileUpload nunca se invoca en primefaces
primefaces p:/ fileupload (1)
Esta pregunta ya tiene una respuesta aquí:
Estoy intentando subir una imagen con las caras principales y el archivoUploadListener no se invoca.
<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"/>
aquí está el frijol:
@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();
}
}
Y aquí está la configuración web.xml:
<?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>
También agregué commons-fileupload y Commons-io jar en classpath. No entiendo por qué no se invoca handleFileUpload.
Ha configurado explícitamente el filtro de carga de archivos para escuchar solo en el despachador de FORWARD
.
Necesita eliminar la siguiente entrada de la asignación de filtro para que escuche de forma predeterminada solo en el despachador de REQUEST
:
<dispatcher>FORWARD</dispatcher>
O bien, para agregar el despachador de REQUEST
a la asignación de filtro para que también se ejecute en las solicitudes normales:
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
El despachador FORWARD
solo es obligatorio cuando se llama a RequestDispatcher#forward()
antes de invocar el filtro. Por ejemplo, mediante alguna solución de reescritura de URL como PrettyFaces. Sin embargo, la información provista hasta ahora en la pregunta no parece indicar de ninguna manera que usted está usando eso.
Sin relación con el problema concreto, como la carga del archivo PrimeFaces requiere Apache Commons IO, es posible que desee considerar IOUtils#copy()
lugar de ese bucle de flujo de entrada / salida detallado. Vea también: Cómo guardar el archivo cargado en JSF .