Componente Upload JSF

Opa.

Galera… tenho um componente para upload de arquivos, no JSF… Ele se chama “imagem”.

Tenho que pegar os dados dele e inserir em um campo bytea, do postgres…

Como faço!?

Tentei assim:

InputStream is = imagem.getUploadedFile().getInputStream(); String aham = imagem.getUploadedFile().getAsString(); byte[] bytes = imagem.getUploadedFile().getBytes();

Nenhum dos 3 funcionou…

Se eu uso inputStream, não cadastra nada… Se uso string, não cadastra também… e byte[] cria 4 ou 5 caracteres… (também está errado).

O método que cadastra:

public void insereImagem(String btImg) throws Exception{ String strQuery = "insert into testeimagem (imagem) values ('"+btImg+"')"; stm.executeQuery(strQuery); }

No caso, este método está como deixei no último teste… recebendo uma string…

enfim…

alguma idéia?!

valeu gurizada…

Desculpa, não entendi o lance.

Ok, JSF. Vc não está usando o fileUpload do Tomahawk, estaria? Eu usei ele e foi susse.

O seu problema é que o arquivo não está chegando no MBean ou está chegando no MBean e não está sendo gravado?

bom, eu consigo ler o conteúdo do arquivo…

to fazendo debug, e consigo ver o conteúdo dele dentro das variáveis…

mas na hora de salvar dentro do campo bytea, eu não sei qual tipo de variavel devo enviar, pois nenhuma delas está sendo salva… ele está inserindo um novo registro, sem nenhuma informação no campo que deveria ser a imagem.

tentei string, byte[] e InputStream, mas esses não funcionaram (ou eu não soube fazê-lo).

Nos códigos que postei acima, está a forma como tentei…

Agora, já estou tentando de outra forma:

(..........)
Connection conexao = getConexao();
        
        PreparedStatement declaracao = null;  
        String sql = "insert into testeimagem (imagem, testa) values(?, ?)";
        try {  
            
            InputStream is  = imagem.getUploadedFile().getInputStream();
            String aham     = imagem.getUploadedFile().getAsString();
            byte[] bytes    = imagem.getUploadedFile().getBytes();
            
            declaracao = conexao.prepareStatement(sql);  
            declaracao.setBytes(1, bytes);
            declaracao.setString(2, aham);
            declaracao.executeUpdate();
(.........)

Enfim… sei lá…

Olha, usando o Hibernate, eu usei byte[] mesmo, e mapeei como @Lob

Só que eu tive problemas com arquivos maiores que 4k, então precisei pegar o driver atual (eu uso oracle).

Ah, na tabela no banco de dados é tipo Blob.

Olha como eu fiz:

JSP

<t:inputFileUpload value="#{conteudoBean.imagem}" storage="" />

MBean ConteudoBean

[code]private UploadedFile imagem = null;
(…)

// action salvar da tela
public String salvar(){
//c é a entidade que vai ser salva no banco

c.setArquivo(imagem.getBytes());
// eu tb salvo o nome do arquivo!

}

[/code]

Entidade Conteudo

@Lob
private byte[] arquivo;

bah… então acho que to lascado…

eu tenho que migrar de um oracle pra um postgres, mais de 10000 imagens, que estavam em um sistema em delphi… preciso conseguir ler estes arquivos e gerar as imagens, além de salvar imagens no mesmo formato.

a vida não é um ki-suco… hehehehe

bom, vou continuar na luta.

valeu!

Olha, eu tive que guardar no banco por requisitos mesmo do sistema, mas no GUJ existem muitas pessoas que aconselham veementemente a guardar apenas um link do arquivo no banco, e salvar a imagem no SERVIDOR de arquivos (e não no banco). Veja se isso não cabe a vc…

Faça uma busca e veja :wink:

o ruim da história é que é um sistema legado… eu tinha pensado nisso, mas esbarrei no ponto onde preciso retirar as imagens do Banco de Dados…

elas estão em um oracle…

enfim… vou continuar na “peleia”…

valeu!

:shock:
:lol:

Mas vc tem o nome desses arquivos, ou pelo menos o tipo? Se tiver, só precisa ir criando os arquivos um por um, com FileOutputStream.

bom, as coisas são um pouco mais complicadas que isso…

por exemplo, a tabela não tem uma chave primária… além disso, está num oracle8… tive problemas com jdbc, e tive que migrar pra um oracle10…

Enfim… é um grande pepino… como diria um amigo meu “odeio sistemas legados”… hehehehe…

to tentando gerar uma imagem assim:

[code]try {
String SQL = “select * from figuras_fso where rownum <= 1”;

        ResultSet rs = stmt.executeQuery(SQL);
        rs.next();
        
        Blob blob = null;
        //blob = rs.getBlob("im_figura_fso");
        response.setContentType("image/jpeg");
        
        System.out.println("just above OutputStream");
        
        InputStream in = rs.getBinaryStream("im_figura_fso");
        OutputStream out = response.getOutputStream();
        int b;
        while ((b = in.read()) != -1) {
            out.write(b);
        }

        in.close();
        out.flush();
        out.close(); 

    }
    catch (Exception exception ) {
        System.out.println("Erro---> " + exception);
        throw new ServletException("Error");
    }[/code]

Quando eu tentava usar getBlob(“nome do campo”), dizia que o método não foi implementado…

daí to tentando fazer direto…

mas não vou desistir…

:lol:

vlwz

Aceito sugestões:

O google não tem sido muito gentil comigo neste caso… hehehe…

valeu

[quote=webeverton]bom, as coisas são um pouco mais complicadas que isso…

por exemplo, a tabela não tem uma chave primária…
[/quote]
É uma entidade fraca? Mas acho que não há impecilho quanto a isso.

Eu tb tive problemas com o JDBC para as versões 8i, peguei o JDBC da 10g e funcionou beleza. Mas o banco continuou sendo o 8i.

É, sistemas legados dão pano para manga…

Infelizmente eu não tenho como te ajudar, prq nunca mexi direto com os JDBC da vida, eu tenho usado o Hibernate que esconde essa parte. :cry:

No google parece igual ao que vc fez.

Boa Sorte. :smiley: (E não esqueça de dar notícias aqui no tópico!)

Caracas, eu tenho editado muito meus posts. Tente usar a string “select im_figura_fso from figuras_fso” e veja o que acontece.

complicado… hehehe…

li que no oracle é preciso usar um driver diferente para tratar campos blob, mas não lembro onde… to perguntando pro mestre google.

agora, uma coisa é certa… quando eu achar uma solução, vou postar aqui, pra que outros não sofram como eu estou sofrendo…

lol

valeu…

Hahaha Eu estou te explicando o negócio do driver oracle.

É o seguinte: nas versões 8i e 9i do OJDBC não conseguem tratar campos clob/blob com mais de 4k. Segundo um tutorial do hibernate, vc tem vários workarounds, ou mesmo simplesmente baixar a versão 10g do OJDBC. Teoricamente ela funciona bem com a versão 9i do banco, e até agora tem funcionado bem com o 8i para mim.

Enfim, a solução…

:smiley:

Minha contribuição sobre como visualizar imagens salvas dentro de um banco postgreSQL, em um campo bytea.

meu servlet:

[code]package pacotao_da_alegria;

import java.io.;
import java.sql.
;
import javax.servlet.;
import javax.servlet.http.
;

/**
*

  • Author: Kyriakos T. Fourniadis
  • Scope: Display Image Servlet
  • Version: 1.0

*/

public class GeraImagem extends HttpServlet {

private Connection con;
private Statement stmt;
private String trace;

/**
 * Setup database connection and create SQL statement
 */
public void init( ServletConfig config ) throws ServletException
{
    // Try database connection
    try{
        // The call to Class.forName explicitly loads the driver class
        //Class.forName("org.gjt.mm.mysql.Driver"); 
        Class.forName("org.postgresql.Driver").newInstance(); 
        //jdbc:mysql://<HOST>:<PORT>/<DB>
        //Connection con = DriverManager.getConnection("jdbc:mysql://localhost/mydb?user=''&password=''");
        con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/banco","usuario","senha");
        // Once a connection has been established we can create an instance 
        // of Statement, through which we will send queries to the database.
        stmt = con.createStatement();  
    }
    catch (Exception exception ) {
        exception.printStackTrace();
        throw new UnavailableException(exception.getMessage());
    }
} // End init()

/**
 * Forward to doGet
 */
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    doPost(request, response);
}

/*
 * NOTE: doPost -> HTTP post requests | doGet -> HTTP get resuest
 */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
    // Simple trace variable for debugging...
    trace = "";
    
    /*
    SELECT *
    FROM image
    WHERE image.image_id = ?variable?
     */        
    try {
        String SQL = "select * from testeimagem order by random() limit 1";
        
        ResultSet rs = stmt.executeQuery(SQL);
        rs.next();
        
        Blob blob = null;
        //blob = rs.getBlob("imagem");
        response.setContentType("image/jpeg");
                  
        //InputStream in = blob.getBinaryStream();
        InputStream in = rs.getBinaryStream("imagem");
        OutputStream out = response.getOutputStream();
        int b;
        while ((b = in.read()) != -1) {
            out.write(b);
        }

        in.close();
        out.flush();
        out.close(); 

    }
    catch (Exception exception ) {
        System.out.println("Erro---> " + exception);
        throw new ServletException("Error");
    }
} // end doPost()
        
/*
 * Close SQL statements & database connection
 */
public void destroy()
{
    // Attempt to close statements and database connection
    try{
        stmt.close();
        con.close();
    }       
    
    // Handle database exceptions by returning error to client
    catch (SQLException sqlException){
        sqlException.printStackTrace();
    }
} // End destroy()    

} // End class showImage
[/code]

Era “wilson” então… hehehe

lol

valeu aí CintiaDR…

sobre o hibernate, tô ligado sobre o funcionamento… já utilizo em alguns sistemas… mas a preguiça de fazer a configuração dele, pra apenas alguns testes para um sistema, me fizeram não usar… hehehe

valeu aí gurizada…

Olá a todos!

Poxa! com servlets realmente acho que funciona, mas como estou trabalhando com JSF gostaria de setar algum atributo do bean para apenas exibir a imagem em seguida.

Estou utilizando o UploadedFile do Tomahawk e grava sem problemas, porém, quando vou exibir a imagem que não estou conseguindo.

alguma solução pra isto?

thanks