Seguinte! :D
Estou trabalhando com upload de arquivos para um banco de dados, que devem ser inseridos num campo do tipo BLOB.
Meus procedimentos: - primeiro obtenho o UploadedFile (Classe da PrimeFaces) e sua InputStream; - depois crio uma instancia deste arquivo no próprio diretório do servidor da aplicação (pasta do tomcat, ele gera sozinho quando eu codifico:public void handleFileUpload(FileUploadEvent event) throws IOException {
setUf(event.getFile()); // uf é uma instancia de UploadedFile
is = getUf().getInputstream(); // is é uma instancia de InputStream
// -----------------------------------------------------------------
File file = new File(getUf().getFileName());
}
- Depois is é instanciado como uma nova FileInputStream do mesmo arquivo criado.
no banco de dados, faço a inserção via JDBC com o comando preparedStatement.setBinaryStream(i + 1, (FileInputStream) exemplo)
Segue o código para ficar mais facil o entendimento. Acima foi só um breve resumo.
Meu método que obtem o UploadedFile, cria arquivo temporario e obtem uma FileInputStream. Até aqui tudo ocorre perfeitamente.public void handleFileUpload(FileUploadEvent event) throws IOException {
setUf(event.getFile());
is = getUf().getInputstream();
// -----------------------------------------------------------------
File file = new File(getUf().getFileName());
FileOutputStream fos = new FileOutputStream(file);
int count = 0;
byte[] buf = new byte[8192];
while ((count = is.read(buf)) != -1) {
fos.write(buf, 0, count);
//ops.write(buf, 0, count);
}
fos.flush();
fos.close();
is = new FileInputStream(file);
System.out.println(file.getAbsolutePath());
}
public void addRevisao(List<Object> params) {
String sql = "";
Connection con = null;
PreparedStatement ps = null;
try {
sql += "INSERT INTO TB_REVISAO(REVISAO, CAMINHO, ARQUIVO, NFOLHAS, ";
sql += "OBS, ID_DOC, SEQUENCIAL, FORMATO, ARQUIVO_BLOB";
sql += "TIPO, DATA_INC, ";
sql += "USER_INC, DATA_REV, DATA_RECEBIMENTO) ";
sql += "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
con = getCn();
ps = con.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
System.out.println(params.get(i).toString());
if(params.get(i) instanceof InputStream){ // Levei um bom tempo pra perceber que setObject nao funcionava para Streams.
ps.setBinaryStream(i + 1, (FileInputStream) params.get(i));
} else {
ps.setObject(i + 1, params.get(i));
}
}
ps.executeUpdate();
con.commit();
System.out.println("DEU CERTO!");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
fechaPreparedStatement(ps);
}
}