从Primefaces中的BD下载时,Pdf是否已损坏?

时间:2014-06-09 20:22:43

标签: java jsf pdf primefaces itext

我在下载pdf文件时遇到问题,我是从数据库(Sql Server 2008 R2)获取的,数据是BD中的图像类型,但我在blob中捕获然后将其转换为字节数组。 但要将其转换为StreamedContent以下载pdf文件会损坏,我无法打开它。

Code Java DaoImpl:

@Transactional(readOnly=true)
@Override
public DetalleSolicitudBean obtenerDocumentoImg(DetalleSolicitudBean detalle) throws Exception {
StringBuilder sql = new StringBuilder();
sql.append("SELECT iCorImagen, siCodMun, iCodDocumento, ");
sql.append("vNomArcDig, imgImagen ");
sql.append("FROM GAImgDocumento ");         
sql.append("WHERE iCodDocumento = ? AND siCodMun = ? ");            
List<DetalleSolicitudBean> lista = jdbcTemplateImgDoc.query(sql.toString(),
      new Object[] { detalle.getIcodDocumento(), detalle.getSiCodMun() }, 
      new RowMapper<DetalleSolicitudBean>() {
         public DetalleSolicitudBean mapRow(ResultSet rs, int rowNum) throws SQLException {
            DetalleSolicitudBean det = new DetalleSolicitudBean();
            det.setIcodImagen(rs.getShort("iCorImagen"));
            det.setSiCodMun(rs.getShort("siCodMun"));
            det.setIcodDocumento(rs.getInt("iCodDocumento"));
            det.setVnomArcDig(rs.getString("vNomArcDig"));
            Blob blob = rs.getBlob("imgImagen");
            byte[] imagen = blob.getBytes(1L, (int) blob.length()); 
            det.setImgImagen(imagen);
            return det;
         }
      });
}

代码Java控制器:

private StreamedContent file;

---------------------------------------
    DetalleSolicitudBean detalle = new DetalleSolicitudBean();
    detalle.setIcodDocumento(Integer.valueOf(codigoDocumento));
    detalle.setSiCodMun(Constantes.CODIGO_MUNICIPALIDAD);
    DetalleSolicitudBean imagenDocSolicitud = iSolicitudService.obtenerDocumentoImg(detalle);
    if(imagenDocSolicitud == null){
       addWarnMessage(null, getMessage("solicitudes.form.valAdjDocAsociado"));
    }else{
       InputStream stream = null;
       try {                    
          String nameFile = imagenDocSolicitud.getVnomArcDig();
          stream = new ByteArrayInputStream(imagenDocSolicitud.getImgImagen());
          file = new DefaultStreamedContent(stream, "application/pdf", nameFile);           
       } catch (Exception ex) {
          depurador.error(getGenerarError(Thread.currentThread()
                .getStackTrace()[1].getMethodName(),
                Constantes.NIVEL_APP_CONSTROLLER,
                this.getClass().getName(), ex.getMessage()));
       } finally {
          stream.close();
       }
    }

代码.xhtml:

<p:dataTable id="tblSolicitudes" var="item"
   value="#{cBusquedaSolicitud.listSolicitudes}"
   rowIndexVar="rowIndex" lazy="true" rows="10"
   paginator="true" paginatorPosition="top"
   rowKey="#{solicitud.codSolicitud}"
   selection="#{cBusquedaSolicitud.selectSolicitud}">

   ....

   <p:column style="text-align: center;">
      <p:commandLink actionListener="#{cAtencionSolicitud.descargarDocumento}"
         rendered="#{item.icodDocumento != null}" ajax="false"
         action="docVistaEscrito" update=":listaMensajes">
         <span class="ui-icon ui-icon-pdf" />
         <f:param name="paramDocumento" value="#{item.icodDocumento}" />                            
         <p:fileDownload value="#{cAtencionSolicitud.file}" />
      </p:commandLink>
   </p:column>
</p:dataTable>

2 个答案:

答案 0 :(得分:0)

您不需要在类控制器中使用字段文件。你应该在你的控制器中有方法:

public StreamedContent getFile(){}

答案 1 :(得分:0)

我正在测试它,我认为将pdf保存到数据库时存在问题(因此我认为我带来了损坏的pdf)。 pdf文件我把它保存为字节数组。

代码Java控制器:

public void guardarDocSolicitud(){
   try{
      if(this.fileDocSolicitud) == null){
         addWarnMessage(null, getMessage("solicitudes.form.valAdjuntarDocumento"));         
      }else{
         InputStream stream = null;
         try {
            stream = this.fileDocSolicitud.getInputstream();
            byte[] b = new byte[stream.available()];
            this.detalle.setImgImagen(b);
            this.detalle.setVnomArcDig(this.fileDocSolicitud.getFileName());
            iSolicitudService.guardarDocumentoImg(detalle, getCVariableSesion().getSiCodUsu(), getCVariableSesion().getCnomTer());
         } catch (IOException ex) {
            depurador.error(getGenerarError(Thread.currentThread()
                  .getStackTrace()[1].getMethodName(),
                  Constantes.NIVEL_APP_CONSTROLLER,
                  this.getClass().getName(), ex.getMessage()));
         } finally {
            stream.close();
         }
         addInfoMessage(null, getMessage("msg.info.operacionExitosa"));
         buscar(null);
      }
   }catch (Exception ex) {
      addErrorMessage(null, getMessage("msg.error.errorGrabar"));
      depurador.error(getGenerarError(Thread.currentThread()
            .getStackTrace()[1].getMethodName(),
            Constantes.NIVEL_APP_CONSTROLLER,
            this.getClass().getName(), ex.getMessage()));
   }
}

Code Java DaoImpl:

@Transactional
@Override
public void guardarDocumentoImg(DetalleSolicitudBean detalle) throws Exception {
   try{
      StringBuilder sql = new StringBuilder();
      sql.append("INSERT INTO GAImgDocumento ");                    
      sql.append("(iCorImagen, siCodMun, iCodDocumento, ");
      sql.append("vNomArcDig, imgImagen, bActivo, ");
      sql.append("siCodUsu, sdFecAct, cNomTer) ");
      sql.append("VALUES(?,?,?,?,?,?,?,?,?) ");         
      jdbcTemplateImgDoc.update(sql.toString(),
           new Object[] { detalle.getIcodImagen(), detalle.getSiCodMun(), detalle.getIcodDocumento(),
                     detalle.getVnomArcDig(), detalle.getImgImagen(), Constantes.TRUE,
                     detalle.getSiCodUsu(), detalle.getSdFecAct(), detalle.getCnomTer() 
      });           
   }catch(Exception e){
      throw new Exception( getGenerarError(Thread.currentThread().getStackTrace()[1].getMethodName(), 
                      Constantes.NIVEL_APP_DAO,
                      this.getClass().getName(),
                      e.getMessage()) );
   }    
}