Aplicaçao Web: Imagem no banco de Dados

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…

  1. Verificar se o form é multipart:

if (FileUpload.isMultipartContent(request)) { ... }
2) Pegar o file do Form:

FormFile formFile = (FormFile) request.getParameter("arquivo")));
  1. Depois você pega o InputStream:
InputStream inputStream = formFile.getInputStream();

Daí você corre para o abraço… :smiley:

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