在Primefaces中从BD下载时,Pdf损坏



我下载pdf文件有问题,我从数据库(Sql Server 2008 R2)中得到它,数据是BD中的图像类型,但我在blob中捕获,然后将其转换为字节数组。但是要把它转换成一个流内容下载的pdf文件损坏了,我不能打开它。

代码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;
         }
      });
}

Code Java Controller:

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>

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

public StreamedContent getFile(){}

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

Code Java Controller:

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()));
   }
}
代码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()) );
   }    
}

相关内容

  • 没有找到相关文章

最新更新