Devolviendo algo de conocimiento a la comunidad, este ejemplo sencillo pero útil para ademas de cargar archivos con el fileupload de primefaces poder leer parámetros adicionales que se envíen en el formulario.
Para poder iniciar se debe configurar JSF en eclipse, deben descargar una implementacion que puede ser Mojarra o MyFaces, una manera de descargar es en el proyecto web Properties->Project Faces -> Java Server Faces -> Download Library (El icono del lado derecho) y ahí escogen la implementacion, y posteriormente agregar el jar de jstl-1.2 a la carpeta WebContent/WEB-INF/lib.
Para usar primefaces basta con agregar el jar a la carpeta WEB-INF/lib , pero para usar el fileUpload si es necesario agregar los jars de commons-fileupload y commons-io los cuales deben revisar en la documentación de primefaces que versión corresponde según la versión de prime y configurar un par de lineas en el web.xml:
<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> </filter-mapping>
En la vista vamos a tener el siguiente código:
<f:view> <h:head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <title>File Upload Sample</title> </h:head> <body> <h:form id="myform" enctype="multipart/form-data"> <h:outputStylesheet library="css" name="style.css" /> <p:growl id="messages" showDetail="true" /> <p:fileUpload fileUploadListener="#{fileuploadcontroller.uploadAttachment}" mode="advanced" update="messages" multiple="true" sizeLimit="900000000" allowTypes="/(\.|\/)(gif|jpe?g|png|txt)$/" uploadLabel="Cargar" cancelLabel="Cancelar" label="Buscar archivo" required="true" /> <br /> <br /> <strong>Mensaje</strong> <br/><br /> <p:inputText id="txtField" style="width:250px" maxlength="40"> <f:validateRequired for="txtField"></f:validateRequired> </p:inputText> </h:form> </body> </f:view>
En la configuración del fileUpload definimos el modo advanced para que aparezca con ese estilo de menubar, el tamaño máximo del archivo, que permita varios uploads a la vez , los tipos de archivo permitidos y por ultimo el método del controlador para gestionar la carga del archivo; también podemos notar que tenemos un inputText pero que no esta asociado en la propiedad value a ningun bean, esto sucede ya que al form lo hemos definido como enctype=”multipart/form-data” esto causa que lleguen los valores null al controlador, y la manera en que debemos obtener los parámetros es a través del objeto request que tiene el mapa de parámetros del formulario.
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("form:parametro")
El codigo del controlador:
@ManagedBean(name="fileuploadcontroller") @RequestScoped public class FileUploadController { public void uploadAttachment(FileUploadEvent event){ UploadedFile file = event.getFile(); ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); String txtField = ec.getRequestParameterMap().get("myform:txtField"); String filePath = ec.getRealPath(String.format("/resources/img/%s",file.getFileName())); try { FileOutputStream fos = new FileOutputStream(filePath); fos.write(file.getContents()); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,String.format("Archivo cargado: %s ", file.getFileName()), String.format("Mensaje: %s", txtField))); } }
El método uploadAttachment es el que esta asociado en el fileUpload en la propiedad fileUploadListener, dentro de este como vemos podemos obtener el parámetro del inputText a través de :myform:txtField, que corresponden al id del fomulario <form> y el inputText respectivamente, el resultado del ejemplo es cargar el archivo en la carpeta /resources/img y presentar un mensaje con el texto ingresado en el input, que obviamente puede ser utilizado con otros fines acorde al caso que se les presente.
Saludos,
@gishac