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@Id @GeneratedValue (strategy = GenerationType.IDENTITY)
private int id_articulo;
//En la primera prueba tenemos un BLOB directo en la tabla de fichero
@Lob
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
File destFile
= new File(fichero.
getFileName()); FileUtils.copyInputStreamToFile(fichero.getInputstream(), destFile);
articulo a = new articulo();
a.setArchivo(destFile);
a.setTitulo(titulo);
a.setDescripcion(descripcion);
this.controlador.registrarArticulo(a);
}
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<p:dataTable var="articulos" value="#{listadoArticulos.listado}"
rows="10"
paginator="true"
>
<p:column headerText="Titulo" sortBy="#{articulos.titulo}" >
<h:outputText value="#{articulos.titulo}" />
</p:column>
<p:column headerText="Descripcion" >
<h:outputText value="#{articulos.descripcion}" />
</p:column>
[B]<p:column headerText="Fichero" >
<h:outputText value="#{articulos.archivo.name} y pesa #{articulos.archivo.length()}" />
</p:column>[/B]
<p:column headerText="Descarga">
<p:commandLink action="#{articuloBean.getFichero(articulos.archivo)}" value="Descargar"/>
</p:column>
</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
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
return out;
}
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?