Pessoal, estou colocando aqui a solução para gravar e ler um campo Blob num banco Oracle 10g Release 10.1.0.4.0.
É necessário utilizar o driver ojdbc14.jar (manifest 10.1.0.4.0) e os pacotes commons-fileupload-1.1.1.jar e commons-io-1.2.jar. (http://jakarta.apache.org/commons/fileupload/)
Notem que o exemplo do servlet é extremamente simples onde eu sequer fiz validação do tipo de arquivo para upload, está fixo um .jpg.
<html>
<head>
<title>MinhaTelaDeTeste</title>
</head>
<body>
<form name="sistema" method="post" action="<sua classe servlet>" enctype="multipart/form-data">
<input type="file" name="arquivo">
<br><br>
<input type="submit" value="Carregar...">
</form>
</body>
</html>
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {
Connection conn = null;
PreparedStatement pstmt = null;
Statement stmt = null;
try {
PoolConnection conexao = new PoolConnection();
DataSource jdbcURL = conexao.getJdbcURL(); // Conexão do tomcat
conn = jdbcURL.getConnection();
conn.setAutoCommit(false);
response.setContentType("text/html");
if (request.getContentType() != null) { // Se foi submetido o formulário com dados
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(-1); // Tamanho máximo do arquivo em bytes, quando -1 não tem limites
factory.setSizeThreshold(500000);
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
FileItem arquivo = null;
while (iter.hasNext()) { // Processa todos os campos submetidos
FileItem item = (FileItem) iter.next();
if (item.isFormField()) { // Aqui retorna campos tipe text, radio, checkbox, etc
System.out.println("Nome do campo: " + item.getFieldName());
} else { // senão retorna campo tipo file
arquivo = item;
//String fieldName = item.getFieldName();
//String fileName = item.getName();
//String contentType = item.getContentType();
//boolean isInMemory = item.isInMemory();
//long sizeInBytes = item.getSize();
}
}
//Name Null? Type
//------------------------------- -------- ----
//CD_ARQUIVO NUMBER(5)
//DS_NOME_ARQUIVO VARCHAR2(50)
//BL_ARQUIVO BLOB
// Insere valores na tabela, porém sem conteúdo para o campo blob
pstmt = conn.prepareStatement("insert into testeBlob values (?, ?, EMPTY_BLOB())");
pstmt.setLong(1,100);
pstmt.setString(2,arquivo.getName());
pstmt.execute();
stmt = conn.createStatement();
// Consulta para ler o registro que acabou de ser incluído (modo exclusivo)
ResultSet res = stmt.executeQuery("select bl_arquivo from testeblob where cd_arquivo = 100 for update");
if (res.next()) {
Blob mapBlob = res.getBlob(1); // Guarda ponteiro do campo blob
OutputStream blobOutputStream = mapBlob.setBinaryStream(0);
blobOutputStream.write(arquivo.get()); // Atualiza campo blob
blobOutputStream.close();
}
conn.commit(); // Grava as alterações no banco
// Ler da base o registro gravado
res = stmt.executeQuery("select bl_arquivo from testeblob where cd_arquivo = 100");
Blob mapBlob = null;
if (res.next()) {
mapBlob = res.getBlob(1);
}
res.getStatement().close();
// Gera o arquivo em disco com o conteúdo do campo blob
InputStream blobStream = mapBlob.getBinaryStream();
FileOutputStream fos = new FileOutputStream("D:\\Foto.jpg");
byte[] buffer = new byte[10];
int nbytes = 0;
while( (nbytes = blobStream.read(buffer)) != -1 )
fos.write(buffer, 0, nbytes);
fos.flush();
fos.close();
blobStream.close();
}
RequestDispatcher rd = request.getRequestDispatcher("MinhaTelaDeTeste.jsp");
rd.forward(request,response);
} catch (Exception ex) {
ex.printStackTrace();
}
finally {
try {
if (conn != null)
conn.close();
}
catch (Exception e) {
}
}
}
