Cuando varios archivos en nuestra base de datos y queremos mostrarlos en una tabla, y poder descargarlos usando outputResource, se puede ser de la siguiente manera:
1. Se lista los documentos en la tabla. Dentro de esta tabla hay un botón btnVerDocumentoAsociado, en el cual , cuando se presiona se envía el id del documento, que se va a mostrar.
<ice:dataTable id="dbtArchivos" var="archivo" value="#{bean.archivosAsociados}" rows="5">
<ice:column style="width:105pt;">
<f:facet name="header">
<ice:outputText value="#{formLabels.lblArchivo}" styleClass="form_label"/>
</f:facet>
<ice:outputText value="#{archivo.nomDocumento}" styleClass="form_output"/>
</ice:column>
<ice:column>
<f:facet name="header">
<ice:outputText value="#{formLabels.lblTipoArchivo}" styleClass="form_label"/>
</f:facet>
<ice:graphicImage url="../../resources/images/mimeTypes/#{archivo.icono}" style="height: 25px;"/>
</ice:column>
<ice:column>
<f:facet name="header">
</f:facet>
<ice:commandButton id="btnVerDocumentoAsociado" actionListener="#{bean.generarDocumentoAsociado}"
image="../../resources/images/catalogos/buscar.png" styleClass="appImageButton" rendered="#{archivo.idDocumento > 0}">
<f:attribute name="archivo" value="#{archivo}"/>
</ice:commandButton>
</ice:column>
</ice:dataTable>
<ice:outputResource id="fileDocumentoAsociado" resource="#{planEmergenciaBean.documentoAsociadoPlanEmergencia}"
fileName="#{planEmergenciaBean.planEmergenciaDocumentoAsociado.nomArchivo}"
mimeType="#{planEmergenciaBean.planEmergenciaDocumentoAsociado.dscTipoMime}" type="button"
label="Clic para Descargar" shared="false" style="display:none;" />
2. En el backingbean se obtiene el id, del documento.
3. Luego de la base de datos se extrae el documento( que puede ser blob a byte[]);
4. Se asociada al objeto del ouputResource.
5. Por medio de javaScript se presiona el ice:outputResource, que esta en la pantalla
.java
6. Finalmente aparece la pantalla de descarga
public void generarDocumentoAsociado(ActionEvent e){
try{
// se obtiene el id del documento
this.DocumentoAsociado=(Documento)e.getComponent().getAttributes().get("archivo");
// se consulta a la base de datos
DocArchivo documento= this.DocArchivoService.consultarDocArchivo(thisDocumentoAsociado.getIdDocumento());
//se asigna al outputResource
this.documentoAsociado=new ByteArrayResource(documento.getBinArchivo());
// se acciona el ice:outputResource
//Forma para invocar funciones js desde el bean
//el ice:form debe tener un id (en este se llama frm)
JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(),
"onload('frm:fileDocumentoAsociado');");
} catch (Exception e1) {
e1.printStackTrace();
FacesUtils.addErrorMessage("frm:error", "No se pudo obtener el archivo asociado.");
}
}
Función de javaScript
.javaScript
function onload(id) {
document.onload(document.getElementById(id).click());
return false;
}
1. Se lista los documentos en la tabla. Dentro de esta tabla hay un botón btnVerDocumentoAsociado, en el cual , cuando se presiona se envía el id del documento, que se va a mostrar.
<ice:dataTable id="dbtArchivos" var="archivo" value="#{bean.archivosAsociados}" rows="5">
<ice:column style="width:105pt;">
<f:facet name="header">
<ice:outputText value="#{formLabels.lblArchivo}" styleClass="form_label"/>
</f:facet>
<ice:outputText value="#{archivo.nomDocumento}" styleClass="form_output"/>
</ice:column>
<ice:column>
<f:facet name="header">
<ice:outputText value="#{formLabels.lblTipoArchivo}" styleClass="form_label"/>
</f:facet>
<ice:graphicImage url="../../resources/images/mimeTypes/#{archivo.icono}" style="height: 25px;"/>
</ice:column>
<ice:column>
<f:facet name="header">
</f:facet>
<ice:commandButton id="btnVerDocumentoAsociado" actionListener="#{bean.generarDocumentoAsociado}"
image="../../resources/images/catalogos/buscar.png" styleClass="appImageButton" rendered="#{archivo.idDocumento > 0}">
<f:attribute name="archivo" value="#{archivo}"/>
</ice:commandButton>
</ice:column>
</ice:dataTable>
<ice:outputResource id="fileDocumentoAsociado" resource="#{planEmergenciaBean.documentoAsociadoPlanEmergencia}"
fileName="#{planEmergenciaBean.planEmergenciaDocumentoAsociado.nomArchivo}"
mimeType="#{planEmergenciaBean.planEmergenciaDocumentoAsociado.dscTipoMime}" type="button"
label="Clic para Descargar" shared="false" style="display:none;" />
2. En el backingbean se obtiene el id, del documento.
3. Luego de la base de datos se extrae el documento( que puede ser blob a byte[]);
4. Se asociada al objeto del ouputResource.
5. Por medio de javaScript se presiona el ice:outputResource, que esta en la pantalla
.java
6. Finalmente aparece la pantalla de descarga
public void generarDocumentoAsociado(ActionEvent e){
try{
// se obtiene el id del documento
this.DocumentoAsociado=(Documento)e.getComponent().getAttributes().get("archivo");
// se consulta a la base de datos
DocArchivo documento= this.DocArchivoService.consultarDocArchivo(thisDocumentoAsociado.getIdDocumento());
//se asigna al outputResource
this.documentoAsociado=new ByteArrayResource(documento.getBinArchivo());
// se acciona el ice:outputResource
//Forma para invocar funciones js desde el bean
//el ice:form debe tener un id (en este se llama frm)
JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(),
"onload('frm:fileDocumentoAsociado');");
} catch (Exception e1) {
e1.printStackTrace();
FacesUtils.addErrorMessage("frm:error", "No se pudo obtener el archivo asociado.");
}
}
Función de javaScript
.javaScript
function onload(id) {
document.onload(document.getElementById(id).click());
return false;
}