Tenho uma aplicação WEB, usando JSF e Primefaces e MYSQL.
Tem uma tela de cadastro de produto e nele preciso selecionar um PDF, eu consegui anexar esse PDF e da um “insert” no Banco como “BLOB”, porém na hora de listar, não estou conseguindo.
O que preciso… Dar um select nessa tabela e mostrar o PDF para o cliente, porém não estou conseguindo…
ProdutoDAO
StringBuilder sql = new StringBuilder();
sql.append("SELECT idProcesso, Processo");
sql.append(" FROM processos ");
sql.append(" ORDER BY idProcesso ASC");
Connection conexao = ConexaoFactory.conectar();
PreparedStatement comando = conexao.prepareStatement(sql.toString());
ResultSet resultado = comando.executeQuery();
ArrayList<Processos> lista = new ArrayList<Processos>();
while (resultado.next()) {
Processos item = new Processos();
item.setArquivo("select no campo PDF,");
item.setIdProcessos(resultado.getInt("idProcesso"));
lista.add(item);
}
return lista;
}
Novato não faz coisas assim, fera. Novato estuda o básico da linguagem, se chegou aqui, já deixou de ser novato ou está pulando etapas, o que vai trazer muitos outros problemas além deste.
O atributo arquivo, da classe Processos(por que a classe tem nome no plural?) é um byte[]?
Você realmente tem um banco de dados que guarda PDF?
Estou trabalhando com algo parecido, mas ao invés de guardar pdf eu guardo o caminho (Path) de onde o arquivo esta armazenado no servidor.
No meu caso eu acho mais fácil pois guardando o caminho eu só preciso executar a seguinte linha
Não, eu tinha tentando de várias formas… agora ela esta como String, pois eu ia tentar usando o path do PDF.
Porém achei que não seria do melhor jeito.
O que não estou conseguindo é dar o select nessa tabela e converter do BLOB para o arquivo PDF.
É relativamente simples fazer isso, desde que o arquivo seja, efetivamente, PDF.
O arquivo armazenado no banco de dados, na coluna BLOB é um array de bytes ou byte[], por isso a minha primeira pergunta.
A partir do momento que você lê essa coluna, você pode fazer o seguinte:
OutputStream out = response.getOutputStream();
FileInputStream in = new FileInputStream(arrayQueContemOArquivo);
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0){
out.write(buffer, 0, length);
}
in.close();
out.flush();
Isso vai enviar o arquivo pro browser do usuário. Mas, veja, é extremamente importante ler esse byte[] da coluna BLOB.
Fera, para isso você tem que se certificar que o primefaces tem algum componente que suporta renderização de pdf.
Se tiver, o que eu realmente não sei, pois faz muito tempo que não desenvolvo com prime ou jsf, aí você precisa ajustar de acordo com o que o primefaces demanda.
O exemplo que sugeri vai enviar o PDF como arquivo e o browser vai entender que deve ser um download.