Upload de imagens

Galera!



Estou com dúvida … preciso montar uma página JSP que faça upload de uma imagem para um JavaBean … Não quero armazená-la em disco, somente tratar em variáveis no JB e inserir no banco …



Para inserir eu tenho um exemplo, mas como fazer para receber esta imagem no JavaBean?



Muito obrigado.

Vai em:

http://www.jspsmart.com/



clica no botão jspsmatUpload.

Ae franklin … valeu de novo! :smiley:



Mas não tem como fazer direto ??? Não queria usar classes de terceiros …

não deve ser muito complicado … o próprio HTML já faz o "Browse" e posta alguma coisa … não tem como fazer um request.getALGO ?



Valeu !!!

Olá.



não. Vc pode implementar o seu próprio componente de up-loads, ou procurar por outros componentes. Certametne existem outros…

Trabalhar com upload de arquivos realmente não é algo muito simples.

Não existe um método pronto, e para implementar tem que trabalhar com os bits do arquivo mesmo… ir pegando o stream e jogando em algum lugar, e depois transformar essa "coisa" no seu objeto.

Também não é extremamente complexo, mas tem uns detalhezinhos que devem ser bem entendidos para implementar.

Existem alguns projetos Open Source sobre upload de arquivos, você poderia pegar um e analisar o código para entender o que é feito.

Em um desses projetos ele transforma o arquivo que você fez upload em um BufferedStream, que parece ser o mais perto que você vai conseguir chegar de ter uma imagem em um bean utilizando uma dessas classes prontas.

Se você resolver implementar algo do tipo, me passe o código depois! :-]

Eu mesma estava querendo fazer algo assim para transformar em servlet meu projeto de transformar imagem JPEG em um desenho ascii em HTML, mas acabei dando prioridade a outras coisas e deixei a idéia de lado.

Eu achei alguma coisa já …

http://www.onjava.com/pub/a/onjava/2001/04/05/upload.html?page=2

http://www.onjava.com/pub/a/onjava/2001/04/05/upload.html?page=4

:-]

Achei um código de um bean … Veja em:

http://www.onjava.com/onjava/2001/04/05/example/listing1.html



Como usar está nos links do post anterior …

Estou testando agora … :-]

Tá bom, galera … me rendi p/ o jspSmartUpload … isso só pq estou meio sem tempo. Consigo fazer um upload tranquilo em um servidor MySQL, porém gostaria de fazer uma página JSP para ler essa imagem do servidor…



para essa página JSP retornar uma imagem, sei que preciso fazer response.setContentType("image/jpeg");.



Porém como faço p/ ler do banco ???



Para exibir a imagem, vou fazer um

img src="pag_imagem.jsp?imagem=xxx" …



Não sei se fui claro …

[ Esta mensagem foi editada por: schoedler em 14-02-2003 13:35 ]

GENTEEEEEEEEEEEEEEEEE!

Não sei mais oq inventar … criei um html que chama o jsp …

<img src=exibe_imagem.jsp>



O código do exibe_imagem.jsp é (tentei criar como javabean e tb num foi…):

<%@ page import="java.text.,

java.io.
,

java.util.,

java.sql.
,

javax.swing.,

javax.servlet.
,

javax.servlet.http.*,

javax.servlet.jsp.PageContext" %>



<% response.setContentType("image/jpeg");

response.setHeader ("Pragma", "no-cache");

response.setHeader ("Cache-Control", "no-cache");

response.setDateHeader ("Expires",0); %>



<%! char c; %>

<%! byte [] b; %>

<%! int i=0; %>





<% try {

Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection("jdbc:mysql:///test");



ResultSet rs = con.createStatement().executeQuery("SELECT FILE FROM tfiles WHERE ID = 1");



if ( rs.next() ) {

ServletOutputStream sout = response.getOutputStream();

InputStream in = rs.getBinaryStream("FILE");

b = new byte[0x7a120];



for(i = in.read(b); i != -1; ) {

sout.write(b);

in.read(b);

}



sout.flush();

sout.close();

}



rs.close();

con.close();



} catch (SQLException e) {

e.printStackTrace();

}

%>

Ola,



nucan usei FILE do mySql, portanto naum posso ajudar muito. Vc jah procurou no google sobre tipo FILE com Java?

Jah fiz isto com BLOBs do Oracle e naum foi nada facil…



De qualquer forma, meu conselho eh naum colocar imagens no banco, apenas seu path. Facilita muito na hora de fazer um backup do banco e na hora de visualizar uma imagem rapidamente, pois vc naum precisa tira-la do BD.

Esse "FILE" ali é somente um campo de dados LONGBLOB do MySQL … O nosso amigo Franklin disse que já havia feito algo do gênero … estou esperando ele postar aqui !!! :-] :-] :-]

Ué! Agora não entendi mais nada. A resposta esta logo acima.

"Nunca usei FILE, não gosto de armazenar arquivos dentro do banco, procuro sempre armazenar apenas seu path"

Pensei nisso tb, só que gera problemas de arquivos que já existem coisa e tal … Além do mais, quero fazer no MySQL … quero armazenar a imagem dentro do banco, e não só o path.

Pessoal …



Não acredito que isso deva ser tão difícil de ser feito … tem de ser mais fácil !!! Ninguém tem um código para postar ???



Obrigado.

Pessoal !!!



Nem acredito … Funcionou essa coisa! :-]

Eu fiz sem JavaBens …

A porcaria do jspSmartUpload que estava rateando … utilzei o UploadBean … http://www.javazoom.net/index.shtml.



Para exibir a imagem, foi simples: criei um html que chamava o jsp …

<IMG SRC="exibe_imagem.jsp">



E o código de exibe_imagem.jsp:

Code:


&lt;%@ page import=&quot;java.text.,

java.io.
,

java.util.,

java.sql.
,

javax.swing.,

javax.servlet.
,

javax.servlet.http.*,

javax.servlet.jsp.PageContext&quot; %&gt;

&lt;% response.setContentType(&quot;image/jpeg&quot;);

response.setHeader (&quot;Pragma&quot;, &quot;no-cache&quot;);

response.setHeader (&quot;Cache-Control&quot;, &quot;no-cache&quot;);

response.setDateHeader (&quot;Expires&quot;,0); %&gt;

&lt;% try {

Class.forName(&quot;com.mysql.jdbc.Driver&quot;);

Connection con = DriverManager.getConnection(&quot;jdbc:mysql:///test&quot;);

String strSQL = &quot;SELECT BINARYFILE FROM uploads&quot;;



if(request.getParameter(&quot;id&quot;) != null) {

strSQL = strSQL + &quot; WHERE UPLOADID = &quot; + request.getParameter(&quot;id&quot;);

}



ResultSet rs = con.createStatement().executeQuery(strSQL);

ServletOutputStream sout = response.getOutputStream();



if ( rs.next() ) {

BufferedInputStream bis1 = new BufferedInputStream( rs.getBinaryStream(&quot;BINARYFILE&quot;) );

byte[] buf1 = new byte[4 * 1024]; // 16K buffer

int len1;



while( (len1=bis1.read(buf1,0,buf1.length) )!=-1) {

sout.write( buf1, 0, len1);

sout.flush();

}

}



rs.close();

con.close();



} catch (SQLException e) {

e.printStackTrace();

}

%&gt;








Tomei o cuidado para não retornar nenhum caractere que não seja da imagem, como linhas em branco. Por isso o código estar tão amontoado…



Vou passar o código para um JavaBean agora para ficar mais limpo …



Valeu a todos que me ajudaram!

O comando CODE do fórum detonou o código … :-]

vou postar novamente:



[PRE]

<%@ page import="java.text.,

java.io.
,

java.util.,

java.sql.
,

javax.swing.,

javax.servlet.
,

javax.servlet.http.*,

javax.servlet.jsp.PageContext" %>

<% response.setContentType("image/jpeg");

response.setHeader ("Pragma", "no-cache");

response.setHeader ("Cache-Control", "no-cache");

response.setDateHeader ("Expires",0); %>

<% try {

Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection("jdbc:mysql:///test");

String strSQL = "SELECT BINARYFILE FROM uploads";



if(request.getParameter("id") != null) {

strSQL = strSQL + " WHERE UPLOADID = " + request.getParameter("id");

}



ResultSet rs = con.createStatement().executeQuery(strSQL);

ServletOutputStream sout = response.getOutputStream();



if ( rs.next() ) {

BufferedInputStream bis1 = new BufferedInputStream( rs.getBinaryStream("BINARYFILE") );

byte[] buf1 = new byte[4 * 1024]; // 16K buffer

int len1;



while( (len1=bis1.read(buf1,0,buf1.length) )!=-1) {

sout.write( buf1, 0, len1);

sout.flush();

}

}



rs.close();

con.close();



} catch (SQLException e) {

e.printStackTrace();

}

%>

[/PRE]

Fala galera!



Consegui resolver esse problemão de fazer upload e dp baixar do banco… Agora venho c/ outro desafio !!!



Quero que o meu JB suporte fazer resizing da imagem que foi feito upload p/ um tamanho fixo determinado, mas soh qdo estiver acima dessas dimensoes…



Algum fera se habilita ???



Valeu!!! :smiley: :smiley: :smiley:

Olá,



tem um projetinho meu no souce forge que faz isto. Chama-se JThumb.

Dá uma olhada no CVS: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jthumb/

Página: http://sourceforge.net/projects/jthumb/



Já faz resizing mas, ainda falta bastante coisa nele. A minha idéia é fazer um programa clone de ACDSEE e JCDSEE, usando SWT com interface gráfica.

Sinta-se a vonta de em mandar contribuições…



ps. Seria muito mais útil e organizado se vc tivesse postado um novo tópico com esta nova dúvida.





Atenciosamente,



Franklin Samir

www.portaljava.com





[ Esta mensagem foi editada por: Franklin em 26-02-2003 17:53 ]

Fala Mestre Franklin!



Eu não olhei ainda, mas meu problema é assim: o cliente vai cadastrar um produto novo nos jsp … até aí tudo bem … o problema é que vou aceitar tudo que é tipo de imagem (que o browser suporte) … o problema é que o usuário pode querer enviar uma imagem muito grande … isso já funciona hoje … depois eu mostro a imagem c/ tamanho fixo …



Só que o problema é o seguinte: daqui a pouco o usuário vai me ligar dizendo que o site está muito lento e tal … e qdo eu vou olhar os kras fizeram upload de uma imagem em 1280x1024 enqto eu fixei no HTML um tamanho de 210x210 …



Eu queria fazer o resize da imagem no momento do cadastro, no upload da imagem … jah gravaria menor tb … e não degradaria a performance da página …



Muito obrigado!