Olá pessoal!
Segue abaixo o que eu fiz (quebrando a cabeça) e com a ajuda de alguns amigos, para copiar a imagem de um local (ex. Minhas Imagens) para um diretorio do meu sistema (Antes da pasta SRC).
OBS: Como já foi discutido várias vezes sobre salvar imagens no BD, minha sugestão para isso nao acontecer é fazer da seguinte forma:
1º - O Objeto (ex. Pessoa) ficaria sem ter o atributo para carregar imagens, logo, esse objeto ficaria da mesma maneira de um projeto que NÃO guarde as img no BD.
2º - Seu JFrame que faz o CRUD deveria ter la uma jLabel (ex. lblFoto) que iria setar a img para aparecer na aplicação.
3º - Eu criei um metodo utilizando JFileChooser para selecionar a imagem desejada. (esse metodo eu chamo no evento do meu botao de carregar imagem)
JFileChooser arquivo = new JFileChooser();
UIManager.put("FileChooser.openDialogTitleText", "Abrir");
UIManager.put("FileChooser.lookInLabelText", "Consultar em");
UIManager.put("FileChooser.openButtonText", "Abrir");
UIManager.put("FileChooser.cancelButtonText", "Cancelar");
UIManager.put("FileChooser.fileNameLabelText", "Nome do Arquivo");
UIManager.put("FileChooser.filesOfTypeLabelText", "Tipo de Arquivo");
UIManager.put("FileChooser.openButtonToolTipText", "Abrir o Arquivo Selecionado");
UIManager.put("FileChooser.cancelButtonToolTipText","Cancelar");
UIManager.put("FileChooser.fileNameHeaderText","Nome");
UIManager.put("FileChooser.upFolderToolTipText", "Subir um Nível");
UIManager.put("FileChooser.homeFolderToolTipText","Área de Trabalho");
UIManager.put("FileChooser.newFolderToolTipText","Criar Nova Pasta");
UIManager.put("FileChooser.listViewButtonToolTipText","Lista");
UIManager.put("FileChooser.renameFileButtonText", "Renomear");
UIManager.put("FileChooser.deleteFileButtonText", "Deletar");
UIManager.put("FileChooser.filterLabelText", "Tipo");
UIManager.put("FileChooser.detailsViewButtonToolTipText", "Detalhes");
UIManager.put("FileChooser.fileSizeHeaderText","Tamanho");
UIManager.put("FileChooser.fileDateHeaderText", "Data de Modificação");
UIManager.put("FileChooser.acceptAllFileFilterText", "Todos os Arquivos");
SwingUtilities.updateComponentTreeUI(arquivo);
arquivo.setDialogTitle("Selecione a Imagem");
arquivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & PNG Images", new String[]{"jpg","png"});
arquivo.setFileFilter(filter);
arquivo.setAcceptAllFileFilterUsed(false);
arquivo.setMultiSelectionEnabled(false);
File file = new File("user.dir");
int option = arquivo.showOpenDialog(this);
if(option == JFileChooser.APPROVE_OPTION) {
String caminhoArquivo = "";
caminhoArquivo = arquivo.getSelectedFile().getAbsolutePath();
file = arquivo.getSelectedFile();
String nomeArquivo = file.getName();
int e = nomeArquivo.lastIndexOf(".");
String extensao = nomeArquivo.substring(e);
Image image = null;
try {
image = ImageIO.read(file);
} catch (IOException ex) {
Logger.getLogger(CadPessoas.class.getName()).log(Level.SEVERE, null, ex);
}
if(extensao.equals(".jpg") || extensao.equals(".JPG")){
lblFoto.setIcon(new ImageIcon(arquivo.getSelectedFile().getAbsolutePath()));
try {
lblFoto.setIcon(new ImageIcon(arquivo.getSelectedFile().getCanonicalPath().replace("\\", "/")));
} catch (IOException ex) {
Logger.getLogger(CadPessoas.class.getName()).log(Level.SEVERE, null, ex);
}
try {
caminhoArquivo = arquivo.getSelectedFile().getCanonicalPath().replace("\\", "/");
} catch (IOException ex) {
Logger.getLogger(CadPessoas.class.getName()).log(Level.SEVERE, null, ex);
}
lblFoto.setIcon(new ImageIcon(image.getScaledInstance(lblFoto.getWidth(),lblFoto.getHeight(), image.SCALE_DEFAULT)));
lblNomeFoto.setText(caminhoArquivo);
}else{
JOptionPane.showMessageDialog(null, "Arquivo não suportado", "Erro", JOptionPane.ERROR_MESSAGE);
}
}
4º - Para copiar a img para um diretorio do meu sistema eu faço assim:
ExecutarCmd exe = new ExecutarCmd(p.getPes_FotoNome(),"Imagens/"+p.getPes_Codigo()+".JPG");
exe.copiar();
5º - A minha classe ExecutarCmd:
public class ExecutarCmd {
public static void copiarFile(String dirFonte, String dirDestino)
throws IOException {
File fonte = new File(dirFonte);
File destino = new File(dirDestino);
InputStream in = new FileInputStream(fonte);
OutputStream out = new FileOutputStream(destino);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
System.out.println("copiado para o " + dirDestino);
}
public void executarComando(String dirPrograma) {
try {
Runtime.getRuntime().exec(dirPrograma);
} catch (IOException e) {
e.printStackTrace();
}
}
public void copiarArquivosDiretorios(String dirFonte, String dirDest) {
if (!isExecucao()) {
try {
Runtime.getRuntime().exec(
"xcopy " + dirFonte + "\\*.* " + dirDest + " /S /Y");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public boolean isExecucao() {
String s, saida = "";
try {
Process p = Runtime.getRuntime().exec("tasklist"); // aqui fica o
// camando q
// seleciona a
// lista
BufferedReader resultado = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = resultado.readLine()) != null) {
saida = saida + s;
saida = saida + "\n";
}
int tOriginal = saida.toCharArray().length;
saida = saida.substring(saida.indexOf("xcopy.exe"));
if (tOriginal > saida.toCharArray().length) {
System.out.println("ACHOU !!!!!!!");
return true;
} else {
System.out.println("Nao ACHOU !!!!!!!");
return false;
}
} catch (Exception ex) {
System.out.println("Catch !!!!!!!: " + ex);
return false;
}
}
private String arquivoOrigem;
private String arquivoDestino;
/**
* Cria um objeto que recebe uma String com o nome do arquivo origem e outra
* String com o nome do arquivo destino.
*
* @param arquivoOrigem
* @param arquivoDestino
*/
public ExecutarCmd(String arquivoOrigem, String arquivoDestino) {
this.arquivoOrigem = arquivoOrigem;
this.arquivoDestino = arquivoDestino;
}
/**
* Método que faz a cópia do arquivo origem lendo e gravando em blocos de
* 1024 bytes.
*
* @throws IOException
*/
public void copiar() throws IOException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
arquivoOrigem));
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(arquivoDestino));
byte[] buffer = new byte[1024];
int qtdBytesLidos = in.read(buffer);
while (qtdBytesLidos <= 1024) {
out.write(buffer);
qtdBytesLidos = in.read(buffer);
if (qtdBytesLidos == -1)
break;
}
in.close();
out.close();
}
}
6º - Para mostrar em uma jLabel essa minha img copiada eu faço assim:
ImageIcon img = new ImageIcon("imagens/"+pessoas.getPes_Codigo()+".JPG");
lblFoto.setIcon(new javax.swing.ImageIcon("imagens/"+pessoas.getPes_Codigo()+".JPG"));
lblFoto.setIcon(new ImageIcon(img.getImage().getScaledInstance(lblFoto.getWidth(),lblFoto.getHeight(), Image.SCALE_DEFAULT)));
Bom, se alguém tiver alguma sugestão de melhoramento de código, ou sugestão de melhor processamento, etc. eu agradeço…
Espero ter ajudado!!!
Guilherme