Anexar arquivo do word

13 respostas
kenzard

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 :smiley:

13 Respostas

M

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)?

kenzard

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 ;).

M

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.

kenzard

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. ?  ;
}
M

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
}
kenzard

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 ?

M

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!

kenzard

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)

M

Você consegue colocá-lo no banco sem problemas? É possível visualizá-lo lá? Se sim, qual o código usado para inserir?

kenzard

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.

M

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.

mjmendes

marcobiscaro2112:
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 **";
				}
			}
kenzard

Desculpe a demora para lêr o post, irei tentar aqui marco e mjmendes.

Criado 7 de dezembro de 2009
Ultima resposta 15 de dez. de 2009
Respostas 13
Participantes 3