Eu sei que muita gente, pelo que eu andei pesquisando, é contra esse tipo de coisa mas infelizmente, não tem nenhuma solução para mim a não ser fazer isso. Mas eu preciso que seja salvo as figuras no banco de dados Postgre. Alguém sabe como fazer?? Todos os métodos que eu pesquisei, nenhum funcionou.
Detalhe. Estou usando applet, não sei se isso muda em alguma coisa pra fazer o método. Se alguém puder me ajudar, preciso disso meio urgente pois estou a 2 dias travado nisso
tb gostaria de saber so por curiosidade. qnd estudei sql vi q existe uma objeto image (se n me engano o nome) q salva imagens ate 2gb. eu dei 1 pesquisada no postgres 8.2.3 (o mais recente acho) e n vi esse objeto. acho no mssql deva ter. e ai quem ja usou? em que banco? como eh o insert nesse objetos?
C
Crocodilo
Você pode fazer isso ou via component que já intercala essa funciolidade ou via response.binary , fiz isso injetando em um banco de dados Access 2000 e repliquei isso para front-end.
Já existe isso pronto na internet, no momento não me recordo sobre o componte que usei porém o caminho é PHP ou ASP…
eu sou a favor de armazenar imagens numa tabela de BD, sim!
só não apoio que seja na mesma tabela em que se vai realizar processos pesados.
sugiro, por exemplo, uma tabela de imagens tipo:
CREATETABLEimagem(idINT,conteudoBLOB);
e depois fazer referencia a este ID na tabela relacionada.
tipo “BLOB” pode ser usado no MYSQL e “bytea” (byte array) no PostgreSQL.
na inserção, usa-se o PreparedStatement com os métodos setBlob, setBinaryStream ou setBytes.
P
Pilantra
Valeu galera!! Mas eu preciso disso em Java mesmo. Eu usei o seguinte exemplo:
Se somente falares que não está funcionando, não ajuda nem a ti nem a quem quiser te ajudar.
Até!
Sim para todas as perguntas que você fez. Desculpe, esqueci de colar o erro que dá. Deve ser alguma coisa boba porque senão ele nem axava a imagem hehe. Vejam:
Galera, fiz uns testes aqui no meu banco local. Existe duas funções que são perfeitas, funciona do jeitinho que eu quero, lo_import e lo_export. Acabei de fazer os testes e alem de facilitar muito e diminuir muito o código, é bem mais prático. Só tem um porém, precisa ser root para fazer isso. Se o cara não me passar o login e senha do root eu não vou conseguir funcionar. Alguém sabe como reverter isso?
P
Pilantra
Galera, não tem jeito!!! Consultei no fórum deles e eles me disseram que o template tem que ser salvo em bytes mesmo. Andei pesquisando e descdobri que esse esquema do postgre para adicionar foto pelo setBinaryStream, não funciona nas versões acima do 7.1.
Onde eu li isso o cara falou que só funciona usando o setBytes, mas tentei adaptar ao setBytes e vejam como ficou:
// Adds template to database and gets the ID.PreparedStatementstm=con.conn.prepareStatement("INSERT INTO saude.tabela_teste VALUES(?)");ByteArrayInputStreaminput=newByteArrayInputStream(util.template.getData());stm.setBytes(1,util.template.getData());stm.executeUpdate();
E o erro que retorna é:
FastPath call returned ERROR: invalid large-object descriptor: 0
at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:141)
at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:191)
at org.postgresql.largeobject.LargeObject.write(LargeObject.java:173)
at org.postgresql.jdbc2.PreparedStatement.setBytes(PreparedStatement.java:300)
at cadastro_digital.btCadastrarActionPerformed(cadastro_digital.java:197)
at cadastro_digital.access$000(cadastro_digital.java:21)
at cadastro_digital$1.actionPerformed(cadastro_digital.java:113)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Será que alguém poderia me ajudar?
P
palilo
Opa,
Na JAVA magazine numero 44 tem uma matéria que fala justamente disto, vc pode baixar o arquivo da revista aqui:
mas tem um porém no exemplo o cara nao implementa a inserção pois diz que é algo similar a recuperação da imagem, eu fiz um topico pra ver isso e varias pessoas deram ideias da uma olhada que talvez ajude, esse é o topico: http://www.guj.com.br/posts/list/60858.java#322836
t+
P
palilo
Depois posta ae se vc conseguiu, eu consegui, mas por causa do MVC eu fiz uma gambiarra, eu acho…
A proposito, sou de Maringá também
P
Pilantra
Que massa, tem outro cara aqui também que é de Maringá, só que eu esqueci o nome dele hehe.
Cara, na verdade eu consegui, só não sei se está de acordo com o que o pessoal da Griaule pede para salvar o template. Eu consegui com esse código:
// Todos os LargeObject API chamados precisam estar com a transação bloqueadacon.conn.setAutoCommit(false);// Pega o Large Object ManagerLargeObjectManagerlobj=((org.postgresql.Connection)con.conn).getLargeObjectAPI();// Cria um novo Large Objectintoid=lobj.create(LargeObjectManager.READ|LargeObjectManager.WRITE);// Abre o Large Object para escritaLargeObjectobj=lobj.open(oid,LargeObjectManager.WRITE);// Abre o templateByteArrayInputStreamfis=newByteArrayInputStream(util.template.getData());// Copia os dados do template para o large objectbytebuf[]=newbyte[2048];ints,tl=0;while((s=fis.read(buf,0,2048))>0){obj.write(buf,0,s);tl+=s;}// Fecha o large objectobj.close();// Cadastra no banco de dadosPreparedStatementps=con.conn.prepareStatement("INSERT INTO saude.cadastro_digital VALUES (DEFAULT, ?, ?)");ps.setInt(1,id_medico[cboMedico.getSelectedIndex()]);ps.setInt(2,oid);ps.executeUpdate();ps.close();fis.close();// Finaliza a transaçãocon.conn.commit();
Ele salvou a figura, e fico massa o esquema porque ele salva qualquer coisa que estiver no seu PC e inclusive o template que é um objeto gerado pelo Grfinger. Eu extrai esses bytes do banco de dados e gerou um arquivo cheio de caracteres estranhos. Deve ser o template. Mas qualquer coisa eu testo com esse código.
Valeu.
R
ricardosoares
segue um código testado no hsqldb
/* * Diversos.java * * Created on 31 de Maio de 2007, 18:10 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */packageteste;importjava.lang.*;importjava.math.*;importjava.sql.*;importjava.util.*;importjava.io.*;/** * * @author rico */publicclassDiversos{/** * Creates a new instance of Diversos */publicDiversos(){}/** * @param args the command line arguments */publicstaticvoidmain(String[]args){jdbc();}staticvoidjdbc(){StringdriverClass="org.hsqldb.jdbcDriver";Stringurl="jdbc:hsqldb:mem:teste";Connectioncon=null;try{Class.forName(driverClass);}catch(java.lang.ClassNotFoundExceptione){System.out.println("ClassNotFound: "+e.getMessage());}try{con=DriverManager.getConnection(url,"sa","");jdbc1(con);con.close();}catch(Exceptionex){System.out.println("Exception: "+ex.getMessage());ex.printStackTrace();}}staticvoidjdbc1(Connectioncon)throwsException{System.out.println("-- Criação tabela");StringcreateTable="CREATE TABLE imagem (nome VARCHAR(120), arquivo BINARY)";Statementstmt=con.createStatement();stmt.execute(createTable);System.out.println("--Inserção imagem");StringinsertRow="INSERT INTO imagem (nome, arquivo) VALUES (?, ?)";PreparedStatementpstmt=con.prepareStatement(insertRow);StringnomeArquivo="C:\\temp\\Dieckmann.jpg";FileimagemFile=newFile(nomeArquivo);pstmt.setString(1,imagemFile.getName());byte[]imagemArray=newbyte[(int)imagemFile.length()];DataInputStreamimagemStream=newDataInputStream(newFileInputStream(imagemFile));imagemStream.readFully(imagemArray);imagemStream.close();pstmt.setBytes(2,imagemArray);pstmt.executeUpdate();System.out.println(imagemFile.getName());System.out.println("-- Select");pstmt.close();StringselectImagem="SELECT * FROM imagem";ResultSetrs=stmt.executeQuery(selectImagem);while(rs.next()){StringfileName="C:\\temp\\_"+rs.getString("nome");FileOutputStreamfos=newFileOutputStream(fileName);/* Alternativa 1 - para arquivos muito grandes, economiza memória InputStream arquivoStream = rs.getBinaryStream("arquivo"); byte[] buffer = new byte[10]; int nbytes = 0; while( (nbytes = arquivoStream.read(buffer)) != -1 ) fos.write(buffer, 0, nbytes); arquivoStream.close(); */// Alternativa 2 - Arquivos peguenos, como imagens e talbyte[]buffer=rs.getBytes("arquivo");fos.write(buffer);//fos.flush();fos.close();}}}