Problemas com J2EE x FTP no application server

1 resposta
lupontes

Ola amigos. Estou implementando uma aplicação J2EE que tem que transferir um arquivo para outra máquina na rede. Para tanto optei pelo uso de um cliente FTP através da API commons-net utilizando o otimo tutorial publicado neste forum.
Baseado no metodo na classe de exemplo do tutorial:

01 import java.io.File;
02 import java.io.InputStream;
03 import java.io.FileInputStream;
04 
05 import org.apache.commons.net.ftp.FTPReply;
06 import org.apache.commons.net.ftp.FTPClient;
07 
08 public class MyFTP {
09     public static void main( String[] args ) {
10         String nomeArquivo = null;
11         FTPClient ftp = new FTPClient();
12         try {
13             ftp.connect( "ftp.provedor.com.br" );
14             
15             //verifica se conectou com sucesso!
16             if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {
17                 ftp.login( "usuario", "senha" );
18             } else {
19                 //erro ao se conectar
20                 ftp.disconnect();
21                 System.out.println("Conexão recusada");
22                 System.exit(1);
23             }
24             
25             //para cada arquivo informado...
26             for( int i=0; i<args.length; i++ ) {
27                 //abre um stream com o arquivo a ser enviado
28                 InputStream is = new FileInputStream( args[i] );
29                 //pega apenas o nome do arquivo
30                 int idx = args[i].lastIndexOf(File.separator);
31                 if( idx < 0 ) idx = 0;
32                 else idx++;
33                 nomeArquivo = args[i].substring( idx, args[i].length() );
34                 
35                 //ajusta o tipo do arquivo a ser enviado
36                 if( args[i].endsWith(".txt") ) {
37                     ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
38                 } else if( args[i].endsWith(".jpg") ) {
39                     ftp.setFileType( FTPClient.BINARY_FILE_TYPE );
40                 } else {
41                     ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
42                 }
43                 System.out.println("Enviando arquivo "+nomeArquivo+"...");
44                 
45                 //faz o envio do arquivo
46                 ftp.storeFile( nomeArquivo, is );
47                 System.out.println("Arquivo "+nomeArquivo+" enviado com sucesso!");
48             }
49             
50             ftp.disconnect();
51             System.out.println("Fim. Tchau!");
52         } catch( Exception e ) {
53             System.out.println("Ocorreu um erro: "+e);
54             System.exit(1);
55         }
56     }
57 }

Eu criei um método que recebe como parâmetro o endereço completo o caminho completo para o arquivo:

public boolean sendFileByFtp(String fullPath) throws IOException {
        // Formatando o nome do arquivo substituindo "//" por "\"
        fullPath = fullPath.replace("//", File.separator);
        System.out.println(">>> fullPath " + fullPath);
        String nomeArquivo = null;
        boolean result;
        FTPClient ftp = new FTPClient();
        ftp.connect( "192.168.0.101" );
        // Verifica se não está conectado
        //verifica se conectou com sucesso!
        if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {
            ftp.login( "okscm", "123456" );
        } else {
            //erro ao se conectar
            ftp.disconnect();
            System.out.println("Conexão recusada");
        }
        
        //abre um stream com o arquivo a ser enviado
        InputStream is = new FileInputStream( fullPath );
        
        //pega apenas o nome do arquivo
        int idx = fullPath.lastIndexOf(File.separator);
        if( idx < 0 ) idx = 0;
        else idx++;
        nomeArquivo = fullPath.substring( idx, fullPath.length() );
        
        //ajusta o tipo do arquivo a ser enviado
        if( fullPath.endsWith(".txt") ) {
            ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
        } else if( fullPath.endsWith(".jpg") ) {
            ftp.setFileType( FTPClient.BINARY_FILE_TYPE );
        } else {
            ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
        }
        System.out.println("Enviando arquivo "+nomeArquivo+"...");
        
        System.out.println(">>>InputStream: " + is);
        System.out.println(">>>nomeArquivo: " + nomeArquivo);
        System.out.println(">>>FTP: "+ ftp.getStatus());
        
        //faz o envio do arquivo
        ftp.storeFile( nomeArquivo, is );
        System.out.println("Arquivo "+nomeArquivo+" enviado com sucesso!");
        
        is.close();
        ftp.disconnect();
        System.out.println("Fim. Tchau!");
        
        return true;
    }

Porém quando executo este método é lançado o seguinte erro:

[#|2006-07-14T06:45:43.793-0300|WARNING|sun-appserver-pe8.2|javax.enterprise.system.stream.err|_ThreadID=18;|
java.net.BindException: Cannot assign requested address: bind
        at sun.nio.ch.Net.bind(Native Method)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:119)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
        at com.sun.enterprise.server.ss.ASServerSocket.bind(ASServerSocket.java:244)
        at com.sun.enterprise.server.ss.ASServerSocketImpl.listen(ASServerSocketImpl.java:121)
        at java.net.ServerSocket.bind(ServerSocket.java:320)
        at java.net.ServerSocket.<init>(ServerSocket.java:185)

Este método está num Session Stateless num Sun Application Server.
Se algúem puder me ajudar no que poderia estar errado, ficaria grato.

Abraços a todos.

1 Resposta

J

Puts, o erro em si não sei o que seja, mais o nome do arquivo pode ser feito em uma linha e você pode deixar mais coeso o código faz assim:

//onde existe um metodo que já se conectou com o ftp, e outro metodo que recebe o path do arquivo
//o path do arquivo eu peguei pelo JFileChooser
public void enviarArquivo(File arquivo, String dir) throws FileNotFoundException, IOException {

//manipula o arquivo
FileInputStream arqPronto = new FileInputStream(arquivo);

//seleciona o direitorio de trabalho que o arquivo vai ser gravado
ftp.changeWorkingDirectory(dir);

//grava o arquivo
ftp.storeFile(arquivo.getName(), arqPronto);

Código que você poder colocar em um botão para capturar o arquivo:

//abre um selecionador de arquivo e grava o endereço do arquivo dentro de um file
	JFileChooser selecArqui = new JFileChooser();
	selecArqui.showOpenDialog(null);
	File arquivo = selecArqui.getSelectedFile();

Sendo que assim você já tem path completo ... e quando vc der um getName no file ele retorna exatamente a mesma coisa que você estava fazendo antes ...

Por ex:
Se o arquivo está em: C:\\Exemplos\\joao.xml
ele retorna o joao.xml

Abraço espero ter ajudado

Criado 14 de julho de 2006
Ultima resposta 7 de nov. de 2008
Respostas 1
Participantes 2