我在下载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>
答案 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()) );
}
}