Inserir / Recupera Imagem Postgres [RESOLVIDO]

6 respostas
C

Galera,

Proucurei de ponta a cabeça o GUJ e outros sites achei alguns forúns dados como resolvido porém quando partir para implementação o resultado não era o esperado…
Tenha uma classe de exemplo que fiz para tentar ilustrar meu problema para vocês.

1- SuporteJDBC // Classe que acessa o banco [Postgres]

Abaixo meu código:

**Ele teóricamente inseri, porém queria receber o arquivo do banco e estou tendo problemas, recebo como byte[] mas não sei o que fazer com ele para exibir em um JFrame, gostaria de saber se tem como dar um Parser para File, aceito sugestões:

package ImagemII;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.swing.JFileChooser;

class InsereImagem {
	public static void main(String args[]) throws Exception {
		SalvarImagem();
		ExibiImagem();
	}

	public static byte[] ExibiImagem() {
		ResultSet rs = null;
		try {
			Statement stm = SuporteJDBC.Conexao().createStatement();
			rs = stm.executeQuery("SELECT fotorosto FROM cfuncionario WHERE id = 200");
			while (rs.next()) {
				System.out.print(rs.getBytes("fotorosto").length);
				return rs.getBytes("fotorosto");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void SalvarImagem() {
		JFileChooser fc = new JFileChooser();
		File img = null;
		int res = fc.showOpenDialog(null);
		if (res == JFileChooser.APPROVE_OPTION) {
			img = fc.getSelectedFile();
		}
		byte[] imagem = new byte[(int) img.length()];
		System.out.println("Lendo " + img.length() + " bytes...");

		try{
		DataInputStream is = new DataInputStream(new FileInputStream(img));
		is.readFully(imagem);
		is.close();
		PreparedStatement stmt = SuporteJDBC.Conexao()
				.prepareStatement(
						"INSERT INTO cfuncionario (id, nome, fotorosto) "
								+ "values (200, ?, ?)");
		stmt.setString(1, img.getName());
		stmt.setObject(2, imagem);
		stmt.executeUpdate();
		}catch (Exception e) {
			e.printStackTrace();
		}
		System.out
				.println("Imagem " + img.getName() + " acrescentada ao banco");
	}
}

6 Respostas

G

Henrique,

Achei aqui no GUJ um topico que tem a resposta para a sua pergunta.
Olha o post do renanbarros

http://www.guj.com.br/posts/list/48640.java

[]'s

C

guilhermezerbinatti:
Henrique,

Achei aqui no GUJ um topico que tem a resposta para a sua pergunta.
Olha o post do renanbarros

http://www.guj.com.br/posts/list/48640.java

[]'s

Man,

Infelizmente nao serviu do OutputStream para Imagem nao consegui converter, se alguem tiver uma nova solução agradeço…

danieldomingues86

Ola,

So uma pergunta, nesse sistema ai que voce esta desenvolvendo, voce realmente tem que gravar a imagem no banco??

Flw.

C

danieldomingues86:
Ola,

So uma pergunta, nesse sistema ai que voce esta desenvolvendo, voce realmente tem que gravar a imagem no banco??

Flw.

Infelizment sim… =/

felipehand

Desculpe a ignorancia, mas pra que vc ta lendo a imagem pro DataInputStream no trecho:

try{   
        DataInputStream is = new DataInputStream(new FileInputStream(img));   
        is.readFully(imagem);   
        is.close();   
        PreparedStatement stmt = SuporteJDBC.Conexao()   
                .prepareStatement(   
                        "INSERT INTO cfuncionario (id, nome, fotorosto) "   
                                + "values (200, ?, ?)");   
        stmt.setString(1, img.getName());   
        stmt.setObject(2, imagem);   
        stmt.executeUpdate();   
        }catch (Exception e) {   
            e.printStackTrace();   
        }

Mas no statement vc usa o array de bytes??

C

SOLUÇÃO:

public static boolean salvarFuncionarioFotoCorpo(String imagem) {
		String insertRow = "UPDATE cfuncionario SET fotocorpo=? WHERE id = "
				+ getId() + ";";
		try {
			PreparedStatement pstmt = SuporteJDBC.Conexao().prepareStatement(
					insertRow);
			File imagemFile = new File(imagem);
			byte[] imagemArray = new byte[(int) imagemFile.length()];
			DataInputStream imagemStream = new DataInputStream(
					new FileInputStream(imagemFile));
			imagemStream.readFully(imagemArray);
			imagemStream.close();
			pstmt.setBytes(1, imagemArray);
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return true;
	}

	public static Image capturaImagemRosto() {
		byte[] imageByte = null;
		Image image = null;
		String sql = "SELECT fotorosto FROM cfuncionario WHERE id = " + getId();
		try {
			Statement stm = SuporteJDBC.Conexao().createStatement();
			ResultSet rset = stm.executeQuery(sql);

			while (rset.next()) {
				imageByte = rset.getBytes("fotorosto");
				ImageIcon icon = new ImageIcon(imageByte);
				return icon.getImage();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return image;
	}

	public void SalvarImagem(String nome, int tipo) {
		setModal(true);
		JFileChooser fc;
		UIManager.put("FileChooser.lookInLabelMnemonic", "E");   
        UIManager.put("FileChooser.lookInLabelText", "Examinar em");   
  
        UIManager.put("FileChooser.saveInLabelMnemonic", "S");   
        UIManager.put("FileChooser.saveInLabelText", "Salvar em");   
  
        UIManager.put("FileChooser.upFolderToolTipText", "Um nível acima");   
        UIManager.put("FileChooser.upFolderAccessibleName", "Um nível acima");   
  
        UIManager.put("FileChooser.homeFolderToolTipText", "Desktop");   
        UIManager.put("FileChooser.homeFolderAccessibleName", "Desktop");   
  
        UIManager.put("FileChooser.newFolderToolTipText", "Criar nova pasta");   
        UIManager.put("FileChooser.newFolderAccessibleName", "Criar nova pasta");   
  
        UIManager.put("FileChooser.listViewButtonToolTipText", "Lista");   
        UIManager.put("FileChooser.listViewButtonAccessibleName", "Lista");   
  
        UIManager.put("FileChooser.detailsViewButtonToolTipText", "Detalhes");   
        UIManager.put("FileChooser.detailsViewButtonAccessibleName", "Detalhes");   
  
        UIManager.put("FileChooser.fileNameLabelMnemonic", "N");   
        UIManager.put("FileChooser.fileNameLabelText", "Nome do arquivo");   
  
        UIManager.put("FileChooser.filesOfTypeLabelMnemonic", "A");   
        UIManager.put("FileChooser.filesOfTypeLabelText", "Arquivos do tipo");   
  
        UIManager.put("FileChooser.fileNameHeaderText", "Nome");   
        UIManager.put("FileChooser.fileSizeHeaderText", "Tamanho");   
        UIManager.put("FileChooser.fileTypeHeaderText", "Tipo");   
        UIManager.put("FileChooser.fileDateHeaderText", "Data");   
        UIManager.put("FileChooser.fileAttrHeaderText", "Atributos");   
  
        UIManager.put("FileChooser.cancelButtonText", "Cancelar");   
        UIManager.put("FileChooser.cancelButtonMnemonic", "C");   
        UIManager.put("FileChooser.cancelButtonToolTipText", "Cancelar");   
  
        UIManager.put("FileChooser.openButtonText", "Abrir / Salvar");   
        UIManager.put("FileChooser.openButtonMnemonic", "A");   
        UIManager.put("FileChooser.openButtonToolTipText", "Abrir");   
  
        UIManager.put("FileChooser.saveButtonText", "Salvar =]");   
        UIManager.put("FileChooser.saveButtonToolTipText", "S");   
        UIManager.put("FileChooser.saveButtonToolTipText", "Salvar");   
  
        UIManager.put("FileChooser.updateButtonText", "Alterar");   
        UIManager.put("FileChooser.updateButtonToolTipText", "A");   
        UIManager.put("FileChooser.updateButtonToolTipText", "Alterar");   
  
        UIManager.put("FileChooser.helpButtonText", "Ajuda");   
        UIManager.put("FileChooser.helpButtonToolTipText", "A");   
        UIManager.put("FileChooser.helpButtonToolTipText", "Ajuda");   
  
        UIManager.put("FileChooser.acceptAllFileFilterText", "Todos os arquivos");
        
        fc = new JFileChooser("c:\");
        fc.setFileFilter(new FileNameExtensionFilter("SOMENTE FOTOS JPG", "jpg"));
		int res = fc.showOpenDialog(null);
		if (res == JFileChooser.APPROVE_OPTION) {
			File arquivo = fc.getSelectedFile();
			try {
				BufferedReader in = new BufferedReader(new FileReader(arquivo));
				minhaImagem = arquivo.getAbsolutePath();
				in.close();
				if (tipo == 1) {
					Funcionario.salvarFuncionarioFotoRosto(minhaImagem);
					JOptionPane.showMessageDialog(null,
							"Foto do Rosto Salva com Sucesso!.",
							"SCF - Newtec",
							JOptionPane.INFORMATION_MESSAGE);
				} else {
					Funcionario.salvarFuncionarioFotoCorpo(minhaImagem);
					JOptionPane.showMessageDialog(null,
							"Foto do Corpo Salva com Sucesso!.",
							"SCF - Newtec",
							JOptionPane.INFORMATION_MESSAGE);
				}
				Toolkit toolkit = Toolkit.getDefaultToolkit();
				imagem = toolkit.getImage(minhaImagem);
				MediaTracker mediaTracker = new MediaTracker(this);
				mediaTracker.addImage(imagem, 0);

				try {
					mediaTracker.waitForID(0);
				} catch (InterruptedException ie) {
					System.err.println(ie);
					System.exit(1);
				}
				setSize(imagem.getWidth(null), imagem.getHeight(null));
				setTitle("Foto: " + nome);
				setVisible(true);
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}

	}

	public void ExibirImagem(String nome, int tipo) {
		setModal(true);

		if (tipo == 1) {
			imagem = Funcionario.capturaImagemRosto();
		} else {
			imagem = Funcionario.capturaImagemCorpo();
		}
		MediaTracker mediaTracker = new MediaTracker(this);
		mediaTracker.addImage(imagem, 0);

		try {
			mediaTracker.waitForID(0);
		} catch (InterruptedException ie) {
			System.err.println(ie);
			System.exit(1);
		}
		setSize(imagem.getWidth(null), imagem.getHeight(null));
		setTitle("Foto: " + nome);
		setVisible(true);
	}

Tá ai galera, pra quem precisar, completinho do JFileChooser até a exibição em um JFrame.

A tela onde exibi extende de um JDialog, ou JFrame, como queirão…

O Campo no postgres bytea.

Espero que ajude!! Abraços!

Criado 2 de setembro de 2009
Ultima resposta 4 de set. de 2009
Respostas 6
Participantes 4