Recuperando um blob de uma entidade não persistida [+AJUDA]

0 respostas
rollei

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

Criado 16 de abril de 2009
Respostas 0
Participantes 1