Bom dia, estou com um problema e gostaria da ajuda de voces.
Preciso salvar uma imagem no banco de dados de uma aplicaçao Web.
Quando executo em minha máquina local funciona sem problemas mas, quando fiz o deploy da aplicaçao para o servidor veio o problema.
Uso o seguinte codigo na minha classe DAO que insere a imagem no PreparedStatement:
(O método preferenciaContrato.getCaminhoImagem() retorna a url da imagem ex: C:\diretorio\imagem.jpg)
declaracao = conexao.prepareStatement(sql.toString());
File arquivo = new File(preferenciaContrato.getCaminhoImagem());
FileInputStream inputStream = new FileInputStream(arquivo);
declaracao.setBinaryStream(i++, inputStream, (int) arquivo.length());
declaracao.executeUpdate();
Porém, como a classe DAO está no servidor este caminho (da imagem) nao é encontrado. E me retorna o seguinte erro:
A questão é: Como eu faço para fazer este UpLoad da imgem e salva-la no banco de Dados?
Obrigado desde já.
1º) Você tem que colocar para seu form de cadastro enviar os dados em multipart, acrescentando: enctype=“multipart/form-data”
2º) Você pega o InputStream do seu file proveniente do form
3º) Se no seu Banco de Dados o campo for Blob ou LongBlob, você pega o InputStream converte para Blob e grava no banco…
É isso ae…
Ok! E como ficaria isto? Assim?
é apenas isto?
Cara, não sei como está o andamento do seu projeto, se estiver na fase final creio que minha dica não vá valer a pena.
Nas apliações web aqui da universidade, costumamos guardar no banco uma String com o caminho da imagem, ao inves da imagem em si. Poupa hd e deixa o sistema mais rapido.
Nao, cara, guardar apenas o caminho nao é boa soluçao pois se a url for perdida ou se o cara apagar a imagem o sistema gera erro.
Preciso realmente fazer o upload da imagem para o BD.
Acho que está faltando vc fazer o upload do arquivo pro servidor.
Suponho que o arquivo “C:\Documents and Settings\Christiano\Meus documentos\christiano\doidinho.jpg” esteja no computador cliente, onde roda o browser. Logo, o computador servidor, que roda o Tomcat, não o encontra.
Upload!!!
PS: Acho mais adequado guardar a imagem no BD e não em sistema de arquivo com apontamento. Fica mais organizado e, se vc usar uma tabela exclusivamente para as imagens, não afeta a performance.
Pois é exatamente este o meu problema.
Eu jah tenho uma funcao que guarda e recupera a imagem em um campo Blob do MySql.
Mas estou tendo dificuldades em fazer o Upload desta imagem para o banco dados que está no servidor. Local funciona normalmente mas eu preciso que meu formaulario envie a imagem para o Banco de dados.
Utilize o commons-fileupload.jar…
- Verificar se o form é multipart:
if (FileUpload.isMultipartContent(request)) {
...
}
2) Pegar o file do Form:
FormFile formFile = (FormFile) request.getParameter("arquivo")));
- Depois você pega o InputStream:
InputStream inputStream = formFile.getInputStream();
Daí você corre para o abraço… 
Ola, Sergio, obrigado pela ajuda mas, ainda nao consegui fazer.
Voce poderia me dar um exemplo funcional disto?
Obrigado.
Boolean isMultiPart = FileUpload.isMultipartContent( request );
if( isMultiPart ) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload( factory );
try {
List items = upload.parseRequest( request );
Iterator iter = items.iterator();
int idImagem = 0;
while( iter.hasNext() ) {
FileItem item = (FileItem) iter.next();
if( item.isFormField() ) {
if( item.getFieldName().equals("idImagem") )
idImagem = Integer.parseInt(item.getString());
} else {
if( item.getName().length() > 0 )
gc.insereImagem( idImagem, item );
}
}
} catch (FileUploadException e) {
System.err.println("Erro ao parsear requisiçao!");
e.printStackTrace();
} catch (Exception e) {
System.err.println("Ocorreu um erro geral...");
e.printStackTrace();
}
}
public void insereImagem( int idContato, FileItem item ) {
try {
String sql = "UPDATE contato SET foto = ? " +
"WHERE id_contato = ? ";
DataBase db = new DataBase();
Connection conn = db.open();
PreparedStatement pstm = conn.prepareStatement( sql );
/*
File imagem = new File( path );
FileInputStream imagemStream = new FileInputStream( imagem );*/
pstm.setBinaryStream(1, item.getInputStream(), (int) item.getSize() );
pstm.setInt( 2, idContato );
pstm.executeUpdate();
pstm.close();
conn.close();
db.close();
} catch( SQLException ex ) {
System.err.println("Erro ao tentar inserir imagem!!\n");
ex.printStackTrace();
} catch (IOException e) {
System.err.println("Erro ao inserir InputStream no banco!\n");
e.printStackTrace();
}
}
Ok. Mas agora está dando o erro:
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
na linha:
List items = upload.parseRequest(request);
Ja adicionei o arquivo commons-fileupload-1.1.1.jar
O que mais devo fazer?
http://jakarta.apache.org/commons/io/
Baixa essa outra api das commons, ela é requerida para a fileupload funcionar…
Poe o jar lá na tua lib com a fileupload q tah na mao daih…
Ok! Funcionou. Muito Obrigado!
vlw pelas dicas, isso salvou minha pele