Olá gente, estou criando um programa de cadastro de erros, ja esta pronto, mas quero adicionar uma função que é anexar arquivos do word, para que as pessoas facam o print do erro e cole no word. Quero fazer o seguinte, criar um botão anexar, ae aparecer a tela de navegar para escolher o arquivo, como faco isso ? Depois de escolher o arquivo vo querer saber tambem como salvo ele em um lugar desejado ou no BD. vlw galera 
Anexar arquivo do word
13 Respostas
Para abrir uma janela para o usuário navegar pelos arquivos, você usará a classe JFileChooser.
E para mandar para o BD, você pretende mandar o arquivo (binário) ou as informações dentro dele (em texto)?
Marco primeiramente muito obrigado pela ajuda. Quero guardar o arquivo .doc , vou testar aqui a classe JFilerChooser implementando um actionperformed no botão e ja te falo se consegui ;).
OK. Então você poderia pensar como o arquivo será armazenado (tipo de campo, por exemplo BLOB) e depois é só inserir o arquivo normalmente no BD.
Hmmm, procurei aqui Marco, mas não sei quais metodos usar da classe JFileChooser para aparecer a janelinha de navegação para o usuario escolher o arquivo.
private void BAnexoActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser arquivo = null;
arquivo. ? ;
}
Tente o seguinte:
JFileChooser fileChooser = new JFileChooser();
fileChooser.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Word documents", "doc");
fileChooser.setFileFilter(filter);
// e para usá-lo:
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
// aqui você tem o arquivo selecionado!
File file = fileChooser.getSelectedFile();
// agora basta fazer as demais operações
}
Marco certinho, selecionei o arquivo e consegui joga-lo para o banco de dados, abri o mesmo e vi que na coluna dos anexos esta o binário longo. Agora para finalizar, na minha tela de consulta terá um lugar para visualizar o anexo, então qual o comando para executar o arquivo, no caso criado do tipo File ?
Uma vez que você resgatou o arquivo File lá do banco de dados, basta executar:
Desktop.getDesktop().open(arquivoResgatado);
E pronto: lá estará seu editor de texto abrindo o arquivo!
Marco fiz o comando para mostrar o arquivo e deu certinho, mas estou tendo dificuldades para carregar o arquivo do banco de dados, apresenta uma mensagem informando que não esta suportando a operação.
try {
File arqAnexo = (File) banco.resultSet.getBlob("Anexo");
} catch (SQLException ex) {
Logger.getLogger(CadastraErro.class.getName()).log(Level.SEVERE, null, ex);
}
Aparece esta Exception:
Exception in thread “AWT-EventQueue-0” java.lang.UnsupportedOperationException
at sun.jdbc.odbc.JdbcOdbcResultSet.getBlob(JdbcOdbcResultSet.java:4413)
Você consegue colocá-lo no banco sem problemas? É possível visualizá-lo lá? Se sim, qual o código usado para inserir?
Aparentemente consigo coloca-lo no banco sem problemas, pois ao gravar não esta gerando nenhuma exception.
Estou usando o seguinte codigo para inserilo:
try {
String sqlInsert = "insert into ConsultaErro (DescricaoErro,Solucao,Anexo) values('" + TADescricaoErro.getText() + "','" + TASolucao.getText() + "', '"+anexo+"' )";
banco.statement.executeUpdate(sqlInsert);
JOptionPane.showMessageDialog(null, "Gravação realizada.");
TADescricaoErro.setText("");
TASolucao.setText("");
anexo.delete();
} catch (SQLException erro) {
JOptionPane.showMessageDialog(null, erro);
}
A variavel anexo é Global do tipo File, o metodo que pega o anexo esta passando o arquivo via set.
private void BAnexoActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Word documents", "doc");
fileChooser.setFileFilter(filter);
// e para usá-lo:
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
// aqui você tem o arquivo selecionado!
File file = fileChooser.getSelectedFile();
// agora basta fazer as demais operações
setAnexo(file);
}
}
No banco de dados na coluna Anexo esta o arquivo com a descrição Dados Binarios Longos, mas tento abrir e não consigo. Estou usando o banco de dados access e o tipo de dados para guardar o anexo é o objeto ole.
Acontece que com o comando que você executou, você está adicionando uma String (com o nome do arquivo) no banco. Isso porque durante a concatenação de uma String com um outro objeto, o método toString() do objeto é chamado.
Em outras palavras, é como se você fizesse o seguinte:
String sqlInsert = "insert into ConsultaErro (DescricaoErro,Solucao,Anexo) values('" + TADescricaoErro.getText() + "','" + TASolucao.getText() + "', '"+anexo.toString()+"' )";
E isso não adiciona o arquivo no banco de dados. Sugiro que use PreparedStatement para seu código ficar mais limpo e aí provavelmente vai funcionar.
Acontece que com o comando que você executou, você está adicionando uma String (com o nome do arquivo) no banco. Isso porque durante a concatenação de uma String com um outro objeto, o método toString() do objeto é chamado.Em outras palavras, é como se você fizesse o seguinte:
String sqlInsert = "insert into ConsultaErro (DescricaoErro,Solucao,Anexo) values('" + TADescricaoErro.getText() + "','" + TASolucao.getText() + "', '"+anexo.toString()+"' )";E isso não adiciona o arquivo no banco de dados. Sugiro que use PreparedStatement para seu código ficar mais limpo e aí provavelmente vai funcionar.
Para inserir um arquivo em binário no Banco, faço da seguinte forma:
if (new File(sPDF).isFile()) {
String sInsert = "INSERT INTO RPS_PDF (RPS, TIPO, PDF) VALUES(?,?,?)";
PreparedStatement pstat = connBanco.prepareStatement(sInsert);
FileInputStream fs = new FileInputStream(new File(sPDF));
pstat.setInt(1,Integer.parseInt(sRps));
pstat.setInt(2,iTipo);
pstat.setBinaryStream(3,fs,fs.available());
int i = pstat.executeUpdate();
if (i != 0) {
sRetorno = "PDF " + sPDF + " importado para Banco OK";
}
else {
sRetorno = "** PDF " + sPDF + " não importado para Banco **";
}
}
Desculpe a demora para lêr o post, irei tentar aqui marco e mjmendes.