Como fazer um cadastro de produtos com upload de foto?
21 respostas
W
wanderley_patricio
Olá galera do GUJ!
Estou aki mais uma vez para pedir a ajuda dos companheiros,
O meu problema é o seguinte. estou desenvolvendo uma aplicação web em jsp e mysql para venda de produtos, e gostaria de saber se os amigos podem me ajudar a desenvolver essa aplicação, pois não tenho a minima idéia de como trabalhar com imagens. Gostaria que na hora de cadastrar fosse feito o upload da imagem para o banco de dados diretamente e gostaria de saber tbm como fazer para exibir essas imagens distribuidas em 5 linhas e 3 colunas de no máximo.
sou iniciante em desenvolvimento para web, gostaria de pedir que os amigos sejam pacientes comigo e possam exemplificar como tudo isso é feito.
Olá Wanderley!
Baixe estas duas apostilas da Caelum, FJ-21 e FJ-28:
Td que vc precisa saber para esse form com upload está na FJ-21, mas na FJ-28 tb têm muita coisa legal.
Abraço!
W
wanderley_patricio
Caro Guevara,
agradeço a ajuda por passar o material pra poder estudar mais não estou tendo muito tempo pra poder aprender a usar as tecnologias citadas nos tutoriais( VRaport, Hibernate, Spring, Ajax), pois o site que estou desenvolvendo é com Dreamweaver , mysql e jsp simples e pura. gostaria de saber se tem como fazer isso com puro e simples jsp usando dreamweaver.
G
Guevara
Entendo, mas para usar com Java vc precisaria de classes e consequentemente de atributos, métodos, servlet e por ai vai. Talvez algum outro colega tenha alguma outra alternativa para vc.
Abraço!
W
wanderley_patricio
Olá novamente,
estou usando uma biblioteca chamada UploadBean e achei muito interessante pois realmente funciona. o problema é que o upload da imagem é feito em uma pasta que está dentro da minha aplicação. estava tentando fazer com que a imagem fosse salva no banco de dados mysql que contem um campo do tipo blob.
o código abaixo exemplifica o modo como estou tentando fazer:
Gostaria de saber o que é que preciso fazer para que a imagem e o comentário sejam inseridos no banco pois o campo comentario fica null;
att,
M
MarcioJAVA
Fala Wanderley
Seguinte, pra gravar no banco usa um ByteArrayOutputStream…
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(j.getFoto());
stm.setBytes(5, baos.toByteArray());
isso aqui foi um trecho de um programa que fiz… foi projeto Desktop, não web, mas gravava a foto no banco.
vc vai literalmente serializar o objeto que tem a imagem no banco… no caso o
Outra dica… use o poder o PreparedStatement, com os caracteres coringa (pesquise sobre isso…
deve ficar mais ou menos assim…
String sql = "insert into foto(comentario, foto)values(?,?)";
PreparedStatement st = con.prepareStatement(sql);
sm.setString(1, request.getParameter("todo"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(file);
st.setBytes(2, baos.toByteArray());
st.executeUpdate(sql);
Grande Abraço
W
wanderley_patricio
MarcioJAVA:
Fala Wanderley
Seguinte, pra gravar no banco usa um ByteArrayOutputStream...
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(j.getFoto());
stm.setBytes(5, baos.toByteArray());
isso aqui foi um trecho de um programa que fiz... foi projeto Desktop, não web, mas gravava a foto no banco.
vc vai literalmente serializar o objeto que tem a imagem no banco... no caso o
Outra dica... use o poder o PreparedStatement, com os caracteres coringa (pesquise sobre isso...
deve ficar mais ou menos assim..
String sql = "insert into foto(comentario, foto)values(?,?)";
PreparedStatement st = con.prepareStatement(sql);
sm.setString(1, request.getParameter("todo"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(file);
st.setBytes(2, baos.toByteArray());
st.executeUpdate(sql);
Grande Abraço
Olá Marcio, primeiramente quero agradecer por se prontificar a ajudar.
tentei fazer o codigo no qual vc havia orientado a fazer, ele ficou assim:
<%try{ByteArrayOutputStreambaos=newByteArrayOutputStream();ObjectOutputStreamoos=newObjectOutputStream(baos);oos.writeObject("uploadfile");Class.forName("com.mysql.jdbc.Driver");Connectioncon=DriverManager.getConnection("jdbc:mysql://localhost/master","root","m2bm37vvc4");Stringsql="insert into foto(comentario, foto)values(?,?)";PreparedStatementst=con.prepareStatement(sql);st.setString(1,request.getParameter("todo"));st.setBytes(2,baos.toByteArray());st.executeUpdate();}catch(Exceptionex){out.println("Houve uma excessão ao inserir no banco"+ex);}%><h2>Fotoinseridacomsucessonobancodedados!</h2>
mais na hora de inserir os dados gera uma excessão: Houve uma excessão ao inserir no bancocom.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'comentario' cannot be null .
como posso corrigir isso?
V
Vmaia
Olá, de uma verificada se o parametro “todo” está realamente trazendo algo.
Parece que ele está vindo vazio.
Chumba no código um valor qualquer para o comentario.
W
wanderley_patricio
seguindo a sugestão do Vmaia acabei descobrindo que o request.getParamenter(“todo”) está trazendo null como vcs podem observar:
com.mysql.jdbc.ServerPreparedStatement[1] - insert into foto(comentario, foto)values(null,_binary’¬í\0t\0\nuploadfile’)
não sei o que pode está acontecendo. alguém pode dá outra dica.
V
Vmaia
Na pagina que vc coloca o comentario, qual o nome do atributo ?
Vai ver o “textArea” está com outro nome.
W
wanderley_patricio
Vmaia:
Na pagina que vc coloca o comentario, qual o nome do atributo ?
Vai ver o "textArea" está com outro nome.
a alteração ja havia sido feita mas mesmo assim dava erro no insert com comentario com valor null. abaixo está o código:
<%try{Class.forName("com.mysql.jdbc.Driver");Connectioncon=DriverManager.getConnection("jdbc:mysql://localhost/master","root","m2bm37vvc4");Stringsql="insert into foto(comentario, foto)values(?,?)";PreparedStatementst=con.prepareStatement(sql);st.setString(1,request.getParameter("comentario"));ByteArrayOutputStreambaos=newByteArrayOutputStream();ObjectOutputStreamoos=newObjectOutputStream(baos);oos.writeObject("uploadfile");st.setBytes(2,baos.toByteArray());out.println(st);//st.executeUpdate();}catch(Exceptionex){out.println("Houve uma excessão ao inserir no banco"+ex);}%><h2>Fotoinseridacomsucessonobancodedados!</h2>
V
Vmaia
Opa!
Ao inves de usar o request.getParameter(“comentario”) tente usar o request.getAttribute(“comentario”).
Pois está tentando acessar um atributo do form.
W
wanderley_patricio
Vmaia:
Opa!
Ao inves de usar o request.getParameter(“comentario”) tente usar o request.getAttribute(“comentario”).
Pois está tentando acessar um atributo do form.
vou ver se dá certu. valeu
V
Vmaia
wanderley patricio:
Vmaia:
Opa!
Ao inves de usar o request.getParameter(“comentario”) tente usar o request.getAttribute(“comentario”).
Pois está tentando acessar um atributo do form.
não entendi a colocação do amigo, pois o request que vc pediu para passar é o mesmo que ja está definido.
O metodo é diferente…
request.get[b]Parameter/b tente usar o request.get[b]Attribute/b
W
wanderley_patricio
wanderley patricio:
Vmaia:
Opa!
Ao inves de usar o request.getParameter(“comentario”) tente usar o request.getAttribute(“comentario”).
Pois está tentando acessar um atributo do form.
vou ver se dá certu. valeu
continua a mesma coisa.
W
wanderley_patricio
Depois de ter quebrado muito a cabeça, acredito ter encontrado a solução. abaixo segue o codigo que desenvolvi para poder gravar texto junto com imagem no banco.
<%@pagecontentType="text/html; charset=utf-8"language="java"import="java.sql.*, java.io.*"errorPage=""%><!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/><title>UntitledDocument</title></head><body><%try{Class.forName("com.mysql.jdbc.Driver");Connectioncon=DriverManager.getConnection("jdbc:mysql://localhost/master","root","senha");Stringsql="insert into produtos(codigo_barra_produto, descricao_do_produto,fornecedor, valor_unitario,"+"quatidade_inicial, quantidade_atual, quantidade_minima)"+"values('"+request.getParameter("codigoField")+"','"+request.getParameter("produtoField")+"','"+request.getParameter("fornecedorComboBox")+"','"+request.getParameter("valorField")+"','"+request.getParameter("qtdeInicialField")+"','"+request.getParameter("qtdeInicialField")+"','"+request.getParameter("qtdeMinimaField")+//"','"+request.getParameter("dataCadField")+"')";PreparedStatementsmt=con.prepareStatement(sql);smt.executeUpdate();}catch(ClassNotFoundExceptionerroClasse){out.println("Erro na Classe de Conexão!"+erroClasse);}catch(SQLExceptionerroSQL){out.println("Erro ao inserir dados no banco! "+erroSQL);}%><%try{Class.forName("com.mysql.jdbc.Driver");Connectioncon2=DriverManager.getConnection("jdbc:mysql://localhost/master","root","senha");Stringsql2="update produtos set foto = ? where codigo_barra_produto = '"+request.getParameter("codigoField")+"'";PreparedStatementst2=con2.prepareStatement(sql2);//st.setString(1, request.getAttribute("comentario"));ByteArrayOutputStreambaos=newByteArrayOutputStream();ObjectOutputStreamoos=newObjectOutputStream(baos);oos.writeObject("uploadfile");st2.setBytes(1,baos.toByteArray());//out.println(st);st2.executeUpdate();}catch(Exceptionex){out.println("Houve uma excessão ao inserir no banco"+ex);}%></body></html>
agora falta saber como faço para ver a imagem que foi inserida no banco em um página jsp?
W
wanderley_patricio
olá novamente galera estou tentando agora fazer com que as imagens sejam exibidas na página jsp da seguinte forma:
<%@pagecontentType="text/html; charset=utf-8"language="java"import="java.sql.*, java.io.*"errorPage=""%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/><title>Untitled Document</title><styletype="text/css"><!--.style1{color:#FF0000;font-weight:bold;font-size:36px;}--></style></head><body><divalign="center"><spanclass="style1">Lista de Produtos</span></div><p><%try{Class.forName("com.mysql.jdbc.Driver");Connectioncon=DriverManager.getConnection("jdbc:mysql://localhost/master","root","senha");Stringsql="select descricao_do_produto, foto from produtos";PreparedStatementsmt=con.prepareStatement(sql);ResultSetrs=smt.executeQuery();while(rs.next()){%></p><formid="form1"name="form1"method="post"action="listarProdutos.jsp"><tablewidth="200"border="1"><tr><td>produto</td><td>Imagem</td></tr><tr><td><%=rs.getString("descricao_do_produto")%></td><td><%=rs.getBytes("foto")%></td></tr></table><%}}catch(ClassNotFoundExceptionerroClasse){out.println("Erro na Classe de Conexão!"+erroClasse);}catch(SQLExceptionerroSQL){out.println("Erro ao listar dados do banco! "+erroSQL);}%></form><p> </p></body></html>
O problema é que a imagem está sendo exibida na forma de código como é armazenada no banco. Qual tratamento é necessário para fazer a imagem exibir de forma correta?
quero agradecer a todos que estão ajudando. muito brigadoooo!! :)
M
MarcioJAVA
Cara mais uma coisa, na foto vai dar erro… vc tá tentando gravar uma String. Ele vai gravar… mas não a foto.
vc vai ter que fazer o seguinte:
Suponhamos que vc armazenava a foto num objeto Image, com nome img:
Image img;
quando for armazenar, use o lance do ByteArrayOutputStram e DataOutputStram e writeObject
quando for ler use o ByteArrayInputStram e DatainputStram e readObject
esse readObject recebo o getBytes, e monta um objeto
faça un casting para o Image…
mais ou menos assim:
ByteArrayInputStream bais = new ByteArrayInputStream();
DataInputStream dis = new DataInputStream(bais);
Object o = dis.readObject(rs.getBytes());
img = (Image) o;
W
wanderley_patricio
MarcioJAVA:
Cara mais uma coisa, na foto vai dar erro... vc tá tentando gravar uma String. Ele vai gravar.... mas não a foto.
vc vai ter que fazer o seguinte:
Suponhamos que vc armazenava a foto num objeto Image, com nome img:
Image img;
quando for armazenar, use o lance do ByteArrayOutputStram e DataOutputStram e writeObject
quando for ler use o ByteArrayInputStram e DatainputStram e readObject
esse readObject recebo o getBytes, e monta um objeto
faça un casting para o Image...
mais ou menos assim:
ByteArrayInputStream bais = new ByteArrayInputStream();
DataInputStream dis = new DataInputStream(bais);
Object o = dis.readObject(rs.getBytes());
img = (Image) o;
Deixa eu ver se entendi Marcio. vc que dizer que a forma como estou armazenando a imagem de forma incorreta?
No caso teria que ficar dessa forma:
#<%#try{##Class.forName("com.mysql.jdbc.Driver");#Connectioncon2=DriverManager.getConnection("jdbc:mysql://localhost/master","root","senha");#Stringsql2="update produtos set foto = ? where codigo_barra_produto = '"+request.getParameter("codigoField")+"'";#PreparedStatementst2=con2.prepareStatement(sql2);#//st.setString(1, request.getAttribute("comentario")); #ByteArrayOutputStreambaos=newByteArrayOutputStream();#DataOutputStreamoos=newDataOutputStream(baos);#oos.writeObject("uploadfile");#st2.setBytes(1,baos.toByteArray());#//out.println(st); #st2.executeUpdate();#}catch(Exceptionex){#out.println("Houve uma excessão ao inserir no banco"+ex);#}#%>
e para fazer o retorno da imagem uso esse codigo:
ByteArrayInputStream bais = new ByteArrayInputStream();
DataInputStream dis = new DataInputStream(bais);
Object o = dis.readObject(rs.getBytes());
img = (Image) o;
e para fazer com que a imagem seja exibida na como é que especifico?
seria dessa forma?
<%=rs.getBytes(img)%>
agradeço a atenção!
A
AbelBueno
para seu jsp exibir uma imagem armazenada no banco você precisa entender como o html exibe imagens…
no seu html você coloca o endereço de uma imagem no servidor…
o browser lê a tag de imagem e faz uma nova requisição para o servidor para retornar apenas a imagem daquele endereço…
com isso você tem duas alternativas:
grava a imagem num arquivo temporário e coloca o link apontando para este arquivo. (esta é a solução PORCA)
crie um servlet “especialista” que retornará só a imagem… procure aqui no guj que tem exemplos de como fazer isso…