Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/09/2015, 18:50
Avatar de Hyemin
Hyemin
 
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 10 años, 3 meses
Puntos: 0
Metodo para descargar un BLOB en JavaEE

Estoy trabajando en una aplicación de pruebas para aprender acerca del manejo de ficheros con JavaEE.

Estoy usando Netbeans 8.0.1, Wildfly 8, JPA y Primefaces.

Tengo un solo objeto, una entidad con 4 propiedades

Código Java:
Ver original
  1. @Id @GeneratedValue (strategy = GenerationType.IDENTITY)
  2.     private int id_articulo;
  3.    
  4.     private String titulo;
  5.    
  6.     private String descripcion;
  7.    
  8.     //En la primera prueba tenemos un BLOB directo en la tabla de fichero
  9.     @Lob
  10.     private File archivo;

Hice un formulario para cargar datos y el respectivo BLOB, el formulario cuando va a cargar los datos llama a un metodo en un backing bean

Código Java:
Ver original
  1. public void generarArticulo() throws IOException{
  2.      
  3.  
  4.         File destFile= new File(fichero.getFileName());
  5.     FileUtils.copyInputStreamToFile(fichero.getInputstream(), destFile);
  6.        
  7.         articulo a = new articulo();
  8.         a.setArchivo(destFile);
  9.         a.setTitulo(titulo);
  10.         a.setDescripcion(descripcion);
  11.        
  12.        
  13.         this.controlador.registrarArticulo(a);
  14.        
  15.     }

Este metodo para registrar los datos funciona bien, el registro se añade a la base de datos correctamente.

Luego hice un datatable, funciona bien y me muestra todos los registros, para probar que los ficheros esten siendo traidos correctamente puse un outputext como esta en negritas que me da el peso en bytes de los ficheros y todos coinciden bien.

Código Java:
Ver original
  1. <p:dataTable var="articulos" value="#{listadoArticulos.listado}"
  2.                          rows="10"
  3.                          paginator="true"
  4.                          >
  5.                     <p:column headerText="Titulo" sortBy="#{articulos.titulo}" >
  6.         <h:outputText value="#{articulos.titulo}"  />
  7.     </p:column>
  8.     <p:column headerText="Descripcion" >
  9.         <h:outputText value="#{articulos.descripcion}" />
  10.     </p:column>
  11.   [B]<p:column headerText="Fichero" >
  12.       <h:outputText value="#{articulos.archivo.name} y pesa #{articulos.archivo.length()}"  />
  13.     </p:column>[/B]
  14.      
  15.           <p:column headerText="Descarga">
  16.               <p:commandLink action="#{articuloBean.getFichero(articulos.archivo)}" value="Descargar"/>
  17.                      
  18.     </p:column>          
  19.                            
  20. </p:dataTable>

Ahora el desafio que se me plantea es hacer que el usuario descargue directamente de ese objeto en memoria el fichero, probe muchas formas y no consigo hacerlo funcionar.

Lo ultimo que hice fue el metodo getFichero(File file) que pueden ver en el commandLink del codigo anterio el cual llama a este metodo

Código Java:
Ver original
  1. public FileOutputStream getFichero (File file) throws FileNotFoundException, IOException {
  2.  
  3.        FileInputStream in = new FileInputStream (file);
  4.        FileOutputStream out = new FileOutputStream("/home/alex/ficheros/"+file.getName());
  5.        int c;
  6.        
  7.        while ((c = in.read()) != -1) {
  8.                 out.write(c);
  9.             }
  10.        
  11.        return out;
  12.        
  13.         }

El metodo que consegui hacer me trae de la base el fichero y me lo copia en la carpeta destino, el problema es que aun no me di cuenta como hacer para que en lugar de copiar a una carpeta se le presente al usuario un dialogo de descarga normal en el browser.

Alguna idea?