Olá ... pessoal estou precisando mostrar na tela um campo blob que o usuário adicionou, porem ainda nao persistiu. O hibernate tem um problema em gerenciar blobs na mesma session (ate onde eu sei) porque ele cria um dummyBlob que nao tem todos os metos e para fazer o download do blob e enviar para o navegador eu preciso usar justamente um desses metodos
vou colocar um trecho do codigo da adicao do blob apesar de achar que nao precisa estou soh setando na entidade o blob.
for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
ArquivoAnexo arquivo = (ArquivoAnexo) iterator.next();
nomeCompleto = a.getTipoDocumento().getNome() + " "
+ ua.getNome() + " " + this.getCodigoDocumento() + "/"
+ dataString;
documento = new DocCorrec();
documento.setIndicadorPublicacao("N");
documento.setDataRegistro(new Date());
documento.setArquivoGravado(arquivo.getArquivo());
documento.setTarefa(tarefa);
documento.setArquivo(arquivo.getDocAnexo()); // <<---- EH AQUI QUE ESTOU SETANDO O BLOB FORUM
documento.setTipoDocumento(arquivo.getTipoDocumento());
documento.setId(arquivo.getId());
documento.setExtensao(arquivo.getExtensao());
documento.setNomeDocumento(arquivo.getNome());
documento.setAno(Long.parseLong(dataString));
documento.setNomeCompleto(nomeCompleto);
documento.setUnidadeAdministrativa(ua);
documento.setIndicadorRascunho("N");
documento.setNumeroDocumento(getCodigoDocumento());
setCodigoDocumento(getCodigoDocumento() + 1);
listaDocumentos.add(documento);
}
e aqui o metodo que estou usando para mostrar o arquivo o qual foi dado upload (eh na mesma tela, apos o cara dar o set no documento, ainda nao foi persistido no banco)
public static void detalharDocumento(Blob blobArquivo, String nomeArquivo) {
try {
Blob blob = blobArquivo;
ServletOutputStream sos;
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse res = (HttpServletResponse) facesContext.getExternalContext().getResponse();
sos = res.getOutputStream();
sos.write(blob.getBytes(1, (int) blob.length())); // <<---- O ERRO ESTA OCORRENDO AQUI
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);
}
}
10:25:58,221 FATAL [application] java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
javax.faces.el.EvaluationException: java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
Caused by: java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
Como faco para exibir esse arquivo?
[]'s