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