FileUpload Primefaces, Jboss y Eclipse
[smartads]
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 (página xhtml) se debe colocar 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.
@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.
Fuente: gishak