Já coloquei minha dúvida no site de persistência, mas não me responderam, vou tentar nesse fórum.
Tenho uma página onde o usuário pode anexar vários arquivos em uma entidade. Nessa mesma página existe um botão que chama um método para vizualizar os arquivos (download). Bem, quando eu simplesmente adiciono os blobs e salvo a entidade se futuramente eu quiser visualizar os arquivos não tenho problema nenhum, estou conseguindo fazer o download sem problemas. O problema ocorre quando eu adiciono um blob e eu ainda não persisti a entidade. Quando eu tento vizualizar o arquivo o método só funciona na primeira vez!
Trechos de código.
Este é o metodo que esta convertendo o arquivo para o blob na entidade:
public void setArquivoGravado(File arquivoGravado) throws SQLException, IOException {
this.arquivoGravado = arquivoGravado;
FileInputStream fis = new FileInputStream(arquivoGravado);
byte[] theBytes = new byte[(int) arquivoGravado.length()];
fis.read(theBytes);
arquivo = Hibernate.createBlob(theBytes);
}
Este é o código que está exibindo o arquivo:
public static void detalharDocumento(Blob blobArquivo, String nomeArquivo) {
try {
BufferedInputStream input = new BufferedInputStream(blobArquivo.getBinaryStream());
byte[] theBytes = new byte[(int) blobArquivo.length()];
input.read(theBytes);
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse res = (HttpServletResponse) facesContext.getExternalContext().getResponse();
ServletOutputStream sos = res.getOutputStream();
sos.write(theBytes);
if (nomeArquivo.toLowerCase().endsWith(".doc")) {
res.setContentType("application/msword");
} else if (nomeArquivo.toLowerCase().endsWith(".pdf")) {
res.setContentType("application/pdf");
} else if (nomeArquivo.toLowerCase().endsWith(".xls")) {
res.setContentType("application/vnd.ms-excel");
} else if (nomeArquivo.toLowerCase().endsWith(".jpeg") || nomeArquivo.toLowerCase().endsWith(".jpg")) {
res.setContentType("image/jpeg");
} else {
res.setContentType("application/octet-stream");
}
res.setHeader("Pragma", "public");
res.setHeader("Cache-control", "must-revalidate");
res.setHeader ("Content-Disposition", "attachment; filename=\"" + nomeArquivo + "\"");
sos.flush();
sos.close();
FacesContext.getCurrentInstance().responseComplete();
} catch (IOException e) {
WebUtil.error("Ocorreu um erro na entrada/saída de dados");
e.printStackTrace();
throw new ApplicationException(e);
} catch (SQLException e) {
WebUtil.error("Ocorreu um erro na consulta.");
e.printStackTrace();
throw new ApplicationException(e);
} catch (NullPointerException e) {
WebUtil.error("Ocorreu um erro na visualização do arquivo.");
e.printStackTrace();
throw new ApplicationException(e);
}
}
Bem, depois de ter debugado a aplicação notei que depois que esta linha:
BufferedInputStream input = new BufferedInputStream(blobArquivo.getBinaryStream());
é executada uma propiedade no blob da entidade muda “needsReset” que antes era FALSE se torna true …
Bem o que preciso fazer para poder recuperar esse blob mais de uma vez da memória?? Me ajudem :~
[]'s