Upload con JSF 2.0
Es importante tener una carpeta definida en el contexto de la aplicación para crear los archivos subidos por el recurso java de fileupload y primefaces en jsf 2.0
nuestro directorio destino se encuentra en /modulos/rh/rhEmpleadoFoto/fotos
<h:form enctype="multipart/form-data" id="formfileupload" prependid="false">
<!--aca neustro componente se ejecuta automaticamente apenas recibe el archivo-->
<p:fileupload actualiza="" allowtypes="/(\.|\/)(gif|jpe?g|png)$/" auto="true" cancellabel="Cancelar" componente="" donde="" dragdropsupport="true" fileuploadlistener="#{rhEmpleadoFotoController.accionFileUpload}" foto="" grafico="" id="fileupload" imagen="" la="" label="Seleccionar" mi="" mode="advanced" rendered="true" renderiza="" se="" sizelimit="1000000" update=":formpersonal:idRhEmpleadoFoto" uploadlabel="Subir al servidor" xhtml="">
</p:fileupload>
<!--
para tener donde visualizar la imagen despues de ingresarse.
El nombre en el contexto de la aplicacion para mi controlador es rhEmpleadoFotoController
-->
<p:graphicimage cache="false" height="300" id="imagemTmp" style="margin: 0 auto;" value="#{rhEmpleadoFotoController.imagem}">
</p:graphicimage></h:form>
En nuestro xhtml ingresamos el anterior codigo, lo adaptamos de acuerdo al framework que estemos usando en mi caso primefaces.
En el cuerpo de mi controlador ingreso estas funciones teniendo en cuenta que algunas propiedades se deben declarar como privadas en el controlador y se les debe crear métodos accesores y colocadores para que sean accedidos desde otros ámbitos de la aplicación en las .xhtml(UI)
public void accionFileUpload(FileUploadEvent event) { //evento propio del framework
try {
file = event.getFile();
byte[] foto = event.getFile().getContents();
String nomeArquivo = event.getFile().getFileName();
FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
String archivo = scontext.getRealPath("/modulos/rh/rhEmpleadoFoto/fotos/" + nomeArquivo); //guardar en ruta basica para luego mover
crearArchivo(foto, archivo);
imagem = new DefaultStreamedContent(event.getFile().getInputstream()); //agregar geter y seter para poder ser accedida desde otros xhtml
selectedEntidad = new RhEmpleadoFoto(); //entidad para persistir en la base de datos
selectedEntidad.setNombre(nomeArquivo);
selectedEntidad.setIdRhEmpleado(idRhEmpleado);
long peso = event.getFile().getSize();
int x = (int) peso;
selectedEntidad.setPeso(x);
selectedEntidad.setRuta("/modulos/rh/rhEmpleadoFoto/fotos");
selectedEntidad.setLlaveUnica(GenerarRandom().toString());
selectedEntidad.setEstadoEliminado(Boolean.FALSE);
getFacade().create(selectedEntidad); //crea el objeto(RhEmpleadoFoto) en la bd
//dos objetos para hacer renombrado de archivo y copiado a carpetas
RhEmpleadoFoto current = ejbFacade.findObjeto(selectedEntidad);
RhEmpleadoFoto current2 = new RhEmpleadoFoto();
RhEmpleadoFoto current2 = ejbFacade.findObjeto(selectedEntidad);
if (renombrarArchivo(current2.getRuta() + "/" + current2.getNombre(), current2.getRuta() + "/" + (idRhEmpleado.getIdRhEmpleado() + ""))) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "Ingreso Exitoso"));
} else {
if (renombrarArchivo(current2.getRuta() + "/" + current2.getNombre(), current2.getRuta() + "/" + (idRhEmpleado.getIdRhEmpleado() + ""))) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "Ingreso Exitoso")); //para enviar el mensaje a la growl del framework
} else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "" + current2.getRuta() + "/" + current2.getNombre() + " " + current2.getRuta()));
}
}
recreateModel();
FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " Fue Cargado Exitosamente.");
FacesContext.getCurrentInstance().addMessage(null, msg);
//cerrarPanelFoto(); //una funcion booleana para renderizar el contenido en el xhtml de acuerdo a lo sucedido
} catch (Exception ex) {
Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex.getMessage());
FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " Error en la carga:" + ex.getMessage());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
/**
* Funcion para mover y renombrar un archivo
*
* @param String archivo Archivo o directorio a renombrar
* @param String directorio Directorio destino
* @exception RCException Se genera una excepción genérica.
* @return boolean
*/
public boolean renombrarArchivo(String archivo, String directorio) {
try {
FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
String Sarchivo = scontext.getRealPath(archivo);
File archivos = new File(Sarchivo);
String Sdirectorio = scontext.getRealPath(directorio);
File dir = new File(Sdirectorio);
String name = archivos.getName();
int j = name.indexOf(".");
String newname = "" + GenerarRandom() + "" + name.substring(j, name.length());
boolean semovio = archivos.renameTo(new File(dir, newname));
if (!semovio) {
System.out.print("El archivo no se ha Movido ...");
return false;
} else {
current.setNombre(newname);
current.setRuta("/modulos/rh/rhEmpleadoFoto/fotos/" + idRhEmpleado.getIdRhEmpleado()); //una carpeta con el id del objeto que lo contiene, en mi caso empleado
ejbFacade.edit(current);
System.out.print("Se Movio ...");
return true;
}
} catch (Exception e) {
System.out.print("" + e.getMessage());
return false;
}
}
/**
* Funcion para crear un archivo
*
* @param byte[] bytes objeto
* @param String archivo archivo
* @exception RCException Se genera una excepción genérica.
* @return void
*/
public void crearArchivo(byte[] bytes, String archivo) {
FileOutputStream fos;
try {
fos = new FileOutputStream(archivo);
fos.write(bytes);
fos.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex);
}
}
Anexar estas lineas al archivo de configuración de la aplicación web, pero depende del framework usado, en mi caso primefaces.
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> //de mi framework
<init-param>
<param-name>thresholdSize</param->
<!--tamaño maximo de los archivos para el contexto de la aplicacion-->
<param-value>512000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter>
<mime-mapping>
<extension>png</extension>
<mime-type>image/png</mime-type>
</mime-mapping>
usar la librería commons-fileupload-1.2.2.jar y sus librerías dependientes
Para una opcion mas clara en lenguaje nativo descargue este ejemplo. >>