Cadastro com Foto

Alguém poderia me mostrar algum exemplo de formulário (cadastro) de cliente com foto? Guardar referência da imagem, SALVAR a imagem em disco.

Antes que aguém fale: Sim, eu já procurei no google, mas infelizmente achei pouco conteúdo sobre Cadastro com Foto pra Java Desktop.

Obrigado pela ajuda.

[quote=efc]Alguém poderia me mostrar algum exemplo de formulário (cadastro) de cliente com foto? Guardar referência da imagem, SALVAR a imagem em disco.

Antes que aguém fale: Sim, eu já procurei no google, mas infelizmente achei pouco conteúdo sobre Cadastro com Foto pra Java Desktop.

Obrigado pela ajuda.[/quote]

Moleza amigo,

é só fazer assim…

na sua JSP, coloque um formulário assim:

// Não pode faltar o enctype="multipart/form-data"...
<form method="post" action="Controle?cmd=cadastrar" enctype="multipart/form-data">

Nome: <input type="text" name="nome" />
<br/><br/>

foto: <input type="file" name="foto" />
<br/><br/>

<input type="submit" value="Cadastrar Usuário" />

</form>

No seu Servlet faz assim:

DiskFileItemFactory fileupload = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(fileupload);
//sfu (declara o resgate)
	    
	   String nome=null;
	   String foto = null;
	   
       String path= request.getRealPath("/foto");   
       //diretório que irá gravar as imagens é foto ...

       Pessoa p = new Pessoa();
       try{
    	sfu.setSizeMax(2 * 1024 * 1024); //a imagem tamanho de 2Mb
    	List list = sfu.parseRequest(request);
        
    	for(Iterator it = list.iterator(); it.hasNext();){
    		FileItem item =(FileItem) it.next();
    		if(!item.isFormField()){
    			foto = item.getName();
    			if ((foto !=null) & (!foto.equals(""))){
                     
    				 foto= (new File(foto)).getName(); //busca o nome da foto
                     
                     item.write(new File(path+"/"+foto));
                     //grava a imagem
    			}
    		}
            if (item.getFieldName().equals("nome")){
            	nome = item.getString();
            }
    	}
    	
    Pessoa pessoa = new Pessoa(null,nome, foto);

    	// Aqui coloca para gravar no banco.
        PessoaDao pd = new PessoaDao();

        pd.create(pessoa);

       }catch(Exception e){
    
    	   
       }
	   
	}


Cara… mais ou menos isso…

Você vai ter que ter algumas libs como:

commons-fileupload-1.2.1…

:arrow: http://www.guj.com.br/java/271620-gravando-imagem-no-banco-de-dados

:thumbup:

Rsmoraes, minha aplicação é em desktop, esse seu exemplo serve para isso?

Henrique, muito obrigado, consegui implementar o Abrir Imagem, mas o salvar imagem não esta muito claro no link que você passou.
Gostaria de saber se não é melhor salvar o caminho ao invés da imagem toda no banco e também preciso salvar diversas imagens para um mesmo cliente.

Obrigado.

Bem…

Minha duvida é bem semelhante a essa:
http://www.guj.com.br/java/272021-carregar-uma-fotografia-

[quote=efc]
Gostaria de saber se não é melhor salvar o caminho ao invés da imagem toda no banco e também preciso salvar diversas imagens para um mesmo cliente.

Obrigado.[/quote]

Também é uma ótima opção e fica mais leve.

:thumbup:

Henrique,

Essa é a idéia, mas não sei como implementar o SALVAR.
O ABRIR eu consegui com o FileChooser, mas nao sei como fazer o SALVAR.

Obrigado.

Ao abrir você obtem uma String contendo o caminho absoluto da imagem, exemplo: C:\Arquivos\Cliente\foto.jpg

Para salvar crie um campo no BD, por exemplo ds_foto armazene este caminho até a foto C:\Arquivos\Cliente\foto.jpg

:thumbup:

Henrique,

Seguindo sua dica, acho q estou quase lá. Porém existe um problema. Consegui pegar a imagem “real” e tratar ela para que ficasse redimensionada em meu label. Salva certinho.
Mas quando vou Exibir o registro que ja esta salvo ele me mostra a foto em tamanho Gigante, o tamanho padrão. Preciso saber como usar o metodo que ja fiz onde ele faz o tratamento, no mesmo lugar onde exibo a imagem com os outros registros. Veja:

Este é o q uso para abrir e salvar o caminho. Nesse metodo ele também redimensiona minha imagem

[code]
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle(“Importar imagem”);
FileNameExtensionFilter filtro = new FileNameExtensionFilter(“Arquivo de Imagem”, “jpg”, “gif”, “png”); //teste

    fileChooser.setFileFilter (filtro); //teste
    
    if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
    {
        File arquivo = fileChooser.getSelectedFile();//arquivo

        BufferedImage bi = null;
        try {
            bi = ImageIO.read(arquivo); //carrega a imagem real num buffer
        } catch (IOException ex) {
            Logger.getLogger(CadastrarClientes.class.getName()).log(Level.SEVERE, null, ex);
       }
        BufferedImage aux = new BufferedImage(140, 85, bi.getType());//cria um buffer auxiliar com o tamanho desejado
        Graphics2D g = aux.createGraphics();//pega a classe graphics do aux para edicao
        AffineTransform at = AffineTransform.getScaleInstance((double) 150 / bi.getWidth(), (double) 120 / bi.getHeight());//cria a transformacao
        g.drawRenderedImage(bi, at);//pinta e transforma a imagem real no auxiliar
       lbFoto.setIcon(new ImageIcon(aux));//seta no jlabel
         
       jtfFoto.setText(arquivo.getPath());

       
    }
              


}                                            [/code]

Neste é onde avanço o registro, porém ele mostra a imagem no tamanho real, ignorando o metodo de tratamento acima, como uso o metodo acima para que faça a mesma coisa?

if (index <= clienteList.size() - 1) {
            try {
                Clientes contatoAtual = clienteList.get(index);
                jtfNome.setText(contatoAtual.getNome());
                jtfFoto.setText(contatoAtual.getFoto());
                lbFoto.setIcon(new ImageIcon(jtfFoto.getText()));
}
}

Tentei usar o getResource ( “…”);

Mas não se aplica nisso q estou fazendo.

Método que utilizo para realizar o upload de um arquivo:
OBS: O objeto “diretorio” é populada no construtor da classe…pois utilizo uma classe utilitaria para tratar movimentações de arquivos no servidor.

public void uploadArquivo(File arquivoCliente)
{
        File arquivoServidor = new File(diretorio+"\\"+arquivoCliente.getName());
        if(arquivoServidor.exists())
            arquivoServidor.delete();
        try 
        { 
            //Cria um canal de comunicação na fonte 
            FileChannel fonte = new FileInputStream(arquivoCliente).getChannel();  

            //Cria um canal de comunicação no destino 
            FileChannel destino = new FileOutputStream(arquivoServidor).getChannel();  

            //Copia o arquivo da fonte para o destino
            destino.transferFrom(fonte,0,fonte.size());  

            //Fecha os canais 
            fonte.close();  
            destino.close();  
        } 
        catch (IOException ioe) 
        {
            throw new RuntimeException(ioe);
        }  
    }

Se quiser exibir a imagem na aplicação, pesquise sobre JImagePanel do projeto towel

Opa Colega,

Valeu pela ajuda…

Mas seguinte…eu ja estou populando em um JLabel, na primeira vez quando vou Procurar a imagem eu exibo ela já redimensionada e salvo o caminho.
Mas Quando vou pesquisar ela pega o caminho no JtxtField e não redimensiona. CLARO, eu sei que só tratei ela no momento em que BUSQUEI a imagem. Por isso queria saber como mostrar ela redimensionada novamente.

efc

achei uns códigos aqui que estão em [RESOLVIDO], por isso deve ter ajudado alguém a fazer isto, vê se vc consegue adaptar para seu projeto:

:arrow: http://www.guj.com.br/java/207688-redimensionar-imagem-resolvido

:arrow: http://www.guj.com.br/java/204919-como-redimensionar-imagem-no-jlabelresolvido

:thumbup:

Fala Henrique, Blz?

Seguinte, eu estou conseguindo redimensionar a imagem ao buscar, exibo o local em um Jtfield e salvo o caminho dela.

Mas quando vou pesquisar, a imagem não esta mais redimensionada, ela se estende toda pela Jlabel. Isso pq ela ja esta em outro metodo.

A Linha é essa: Exibe normalmente no meu Jlabel, mas com o tamanho original, enorme.

lbFoto.setIcon(new ImageIcon(jtfFoto.getText()))

Este é o metodo que uso para abrir e tratar a imagem para mostra-la no momento:


JFileChooser fileChooser = new JFileChooser();
        fileChooser.setDialogTitle("Importar imagem");
         
        ImagePreviewPanel preview = new ImagePreviewPanel();   
        fileChooser.setAccessory(preview);   
        fileChooser.addPropertyChangeListener(preview);


        

        FileNameExtensionFilter filtro = new FileNameExtensionFilter("Arquivo de Imagem", "jpg", "gif", "png"); //teste
        fileChooser.setFileFilter(filtro); //teste

       if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
           File arquivo = fileChooser.getSelectedFile();//arquivo

            BufferedImage bi = null;
            try {
                bi = ImageIO.read(arquivo); //carrega a imagem real num buffer
            } catch (IOException ex) {
                Logger.getLogger(CadastrarClientes.class.getName()).log(Level.SEVERE, null, ex);
            }
           BufferedImage aux = new BufferedImage(140, 85, bi.getType());//cria um buffer auxiliar com o tamanho desejado
           Graphics2D g = aux.createGraphics();//pega a classe graphics do aux para edicao
           AffineTransform at = AffineTransform.getScaleInstance((double) 150 / bi.getWidth(), (double) 120 / bi.getHeight());//cria a transformacao
           g.drawRenderedImage(bi, at);//pinta e transforma a imagem real no auxiliar
           lbFoto.setIcon(new ImageIcon(aux));//seta no jlabel

           jtfFoto.setText(arquivo.getPath());


        


       }

Eu tentei fazer essa “Gambiarra”, mas não deu certo e até ficou muito feio o código.

JFileChooser arquivo = new JFileChooser();

            File file = new File(jtfFoto.getText());



            //String caminhoArquivo = jtfFoto.getText();

           // caminhoArquivo = arquivo.getSelectedFile().getAbsolutePath();

            file = arquivo.getSelectedFile();



            BufferedImage bi = null;
            try {
                bi = ImageIO.read(file); //carrega a imagem real num buffer
            } catch (IOException ex) {
                Logger.getLogger(CadastrarClientes.class.getName()).log(Level.SEVERE, null, ex);
            }
           BufferedImage aux = new BufferedImage(140, 85, bi.getType());//cria um buffer auxiliar com o tamanho desejado
           Graphics2D g = aux.createGraphics();//pega a classe graphics do aux para edicao
           AffineTransform at = AffineTransform.getScaleInstance((double) 150 / bi.getWidth(), (double) 120 / bi.getHeight());//cria a transformacao
           g.drawRenderedImage(bi, at);//pinta e transforma a imagem real no auxiliar
           lbFoto.setIcon(new ImageIcon(aux));//seta no jlabel

eae efc blz :?:

Tô sem IDE agora, depois vou ver seu código com mais calma, e tentar ajudar.

:thumbup:

Opa Henrique! Td bem?

Muito Obrigado kra…

To fazendo “Caca” nesse código, parece ser algo mto simples pra arrumar, mas eu sou iniciante e não sei msmo…hehehehe

VALEU Henrique fico no aguardo!

Henrique,

Estive olhando alguns exemplos pela net e o pessoal usa tmb o Jpanel. Consegui colocar a imagem em Jpanel tmb.
Porém não sei como setar o caminho da imagem no JtField.

Segue o Código:

Classe Metodo onde uso o FileChooser. ACho que aqui q eu deveria pegar o caminho. Bom…nao sei.

public class Metodo {
     private BufferedImage imagem = null;
    private FileNameExtensionFilter filtro = new FileNameExtensionFilter("Arquivo de Imagem", "jpg", "gif", "png");

    public void AbrirDialogo(JPanel painel) {
        JFileChooser fileChooser = new JFileChooser();


    fileChooser.setFileFilter (filtro);
    int resultado = fileChooser.showOpenDialog(null);
    if (resultado == JFileChooser.APPROVE_OPTION ){
         try {
             URL url = fileChooser.getSelectedFile().toURL();
             carregarImagemEmBuffer ( url );
             painel.add( new Panel( obterImagemDeBuffer(), painel.getSize()));
             painel.setVisible(true);
             painel.repaint();
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Erro!", "Nao foi possivel abrir! " + ex, JOptionPane.ERROR_MESSAGE);
        }
    }//fim do if
    }


    public BufferedImage obterImagemDeBuffer(){

        return imagem;
    }

    public void carregarImagemEmBuffer ( URL url ) throws IOException {
        imagem = ImageIO.read(url);
    }

}//fim da classe Metodo[/code]


Classe Panel.


[code]public class Panel extends JPanel{
    BufferedImage imagem;
    public Panel( BufferedImage imagem, Dimension d ){
        this.imagem = imagem;
        this.setSize(d);
    }
    @Override
    public void paint  (Graphics g ){
        ImageIcon imageFundo = new ImageIcon (imagem);
        g.drawImage ( imageFundo.getImage(),0,0, getWidth(), getHeight(), null);
        setOpaque (false);
        super.paintComponent(g);
    }
}

E aqui é onde chamo ele.

[code]private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
carregar.AbrirDialogo(jpImagem);

}   [/code]

Quero saber como faço para pegar o caminho e setar no JtField.

Valeu!

Este daqui não mostra :?:

 JTextField.setText(fileChooser.getSelectedFile());

:thumbup:

Valeu Henrique…Certinho

Obrigado.