[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){
}
}
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.
[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.
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?
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
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.
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
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);
}
}