2009-10-22 38 views
8

Actualmente estoy buscando archivos cargados usando Java Server Faces. He encontrado this great introduction usando RichFaces. Sin embargo, tengo algunos problemas para entender el proceso aquí.Carga de archivos usando RichFaces

Primero el usuario selecciona un archivo y si la carga inmediata se establece en verdadero, el archivo se procesa utilizando ajax, hasta ahora todo bien. Cuando se trata del siguiente paso sin embargo, el oyente en el lado del grano de la siguiente me confunde:

public void listener(UploadEvent event) throws Exception{ 
    UploadItem item = event.getUploadItem(); 

    File f = item.getFile(); 

    System.out.println(f.getAbsolutePath()); 
} 

la ruta absoluta es en un directorio temporal en mi equipo, estoy seguro de entender, pero ¿cómo habría que hacer el archivo disponible para la webbapplication? Mi aplicación se implementa como un archivo WAR. ¿Es posible subirlo a WAR? Puede sonar estúpido o algo así, pero en realidad podría ser útil.

Soy plenamente consciente de que puedo cambiar el nombre del archivo para copiarlo en una nueva ubicación, pero ¿es eso el camino a seguir?

Respuesta

5

Escribir cosas en su directorio WAR (suponiendo que el WAR se haya reventado como un directorio) es, en general, una mala idea (por las mismas razones que almacenar sus datos en el directorio de la aplicación suele ser una mala idea).

Probablemente desee que termine en una tienda de persistencia, generalmente una base de datos. La forma exacta de administrarlo depende de usted, ya sea que use el sistema de archivos y almacene una referencia en la base de datos o almacene un BLOB en la base de datos directamente y si usa JDBC o JPA o Hibernate, etc.

La lista de los archivos cargados se pueden leer de la base de datos actualizando el panel que los contiene usando algo como <a4j:support event="onuploadcomplete" reRender="info" />.

Un servlet de descarga de archivos (si RichFaces no tiene uno) es bastante fácil de escribir.

+0

como pensaba, gracias por esclarecerlo. Supongo que tendré que buscar la creación de un servlet de descarga. –

+0

¿Alguna vez descubrió cómo crear ese servlet de descarga, Filip? He jugado con el componente fileUpload y no puedo imaginarme dónde va un archivo después de subirlo. – MattSayar

5

No estoy seguro de cuánta ayuda esto (y probablemente sea demasiado tarde), pero este es el código que uso en el servidor, equivalente a su oyente.

public String uploadFile(UploadEvent event) { 
    UploadItem item = event.getUploadItem(); 

    String name = "unnamed_attachment"; 
    byte[] data = item.getData(); 

    try { 
     name = FilenameUtils.getName(item.getFileName()); 
     data = FileUtils.readFileToByteArray(item.getFile()); 
     logger.info("data.length = " + data.length); 
     UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant) 

     details.setBytes(data); 
     details.setResume(true); 
     // Save to database here 

    } catch (Exception e) { 
     FaceletsUtil.addSystemErrorMessage(); 
     logger.error(e, e); 
    } 
    return null; 
} 

La gran pregunta que queda es que usted dice "¿Cómo le hacen el archivo a disposición del webbapplication?". La matriz de bytes está disponible de inmediato. Si desea volver a descargar el archivo, se puede proporcionar como un enlace a un método en una sesión de vista JSF frijol/como:

<h:commandButton action="#{Manager.downloadFile}" value="Download report">        </h:commandButton> 

public void downloadFile() { 
    final HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

    response.setHeader("Content-Disposition", "attachment;filename=radar-report" + new Date() + ".pdf"); // or whatever type you're sending back 
    try { 
     response.getOutputStream().write(uploadDetails.getBytes()); // from the UploadDetails bean 
     response.setContentLength(uploadDetails.getBytes().length); 
     response.getOutputStream().flush(); 
     response.getOutputStream().close(); 
    } catch (IOException e) { 
     logger.error(e, e); 
    } 
    FacesContext.getCurrentInstance().responseComplete(); 
}