Enviar arquivos via ftp passivo atraves de um proxy http autenticado

Bom galera o titulo ja diz tudo

testei algumas formas mas nenhuma funcional com ftp passivo e proxy https autenticado

alguma dica

esse foi o mais proximo que consegui chegar


            System.getProperties().put( "ftProxySet", "true" ); 
            System.getProperties().put( "ftpProxyHost", "ipdoproxy" ); 
            System.getProperties().put( "ftpProxyPort", "21" ); 
            System.getProperties().put("http.proxyUser", "logindoproxy"); 
            System.getProperties().put("http.proxyPassword", "senhadoproxy"); 
		String nomeArquivo = null;
		FTPClient ftp = new FTPClient();
		try {
		    ftp.connect( "ipdoservidor" );
		    
		    //verifica se conectou com sucesso!
		    if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {
		        ftp.login( "logindoservidor", "senhadoservidor" );
		    } else {
		        //erro ao se conectar
		        ftp.disconnect();
		        System.out.println("Conexão recusada");
		        System.exit(1);
		    }
		    
		    String[] arq = ftp.listNames();

                        System.out.println ("Listando arquivos: \n");

                        for (String f : arq){
                            System.out.println("asdasd");
                              System.out.println(f);            

                        }
		    ftp.disconnect();
		    System.out.println("Fim. Tchau!");
		} catch( Exception e ) {
			System.out.println("Ocorreu um erro: "+e);
			System.exit(1);
		}

esse codigo esta me retornando um java.lang.NullPointerException

Adicione e.printStrackTrace(); no seu catch. O erro mostrará a linha em que o NullPointer ocorre.

muito obrigado Erickrar
descobri que ftp.listNames(); esta retornando nulo

pelo que entendi o meu servidor nao aceita conexoes no modo passivo e por isso eu devo um socket servidor na minha aplicação

acho que é por ai

achei alguns topicos aqui no guj mas o pessoal resolveu fazendo a conexao no modo passivo, como nao disponho desse recurso vou dar mais uma pesquisada

de qualquer forma devo implementar algumas coisas a mais na minha aplicacao, alguma dica?

Complementando corrigindo e avancando

meu servidor ftp aceita conexoes em modo passivo mas a principio o proxy autenticado esta impedindo a listagem de diretorio
meu codigo atual é esse

import java.io.IOException; 
import java.net.SocketException; 
import org.apache.commons.net.ftp.FTPClient; 
public class FtpPassivoListar { 
public static void main (String[] args) throws SocketException, 
IOException { 
System.getProperties().put( "ftpProxySet", "true" ); 
System.getProperties().put( "ftpProxyHost", "ipdo meu proxy" ); 
System.getProperties().put( "ftpProxyPort", "21" ); 
System.getProperties().put("http.proxyUser", "login do proxy"); 
System.getProperties().put("http.proxyPassword", "senha do proxy"); 
FTPClient ftp = new FTPClient(); 
ftp.connect( "endereco do servidorftp" ); 
ftp.login( "login do ftp", "senha do ftp" ); 
ftp.changeWorkingDirectory ("meuDir"); 
String[] arq = ftp.listNames(); 
System.out.println ("Listando arquivos: \n"); 
for (String f : arq){ 
System.out.println(f); 
} 
} 
} 

Criei 3 classes aqui
1 envia 1 recebe e 1 lista

O envio de arquivos esta funcionando perfeitamente, o recebimento ate cria um arquivo local mas ele é vazio e acaba dando timeout, e a listagem tambem da timeout

Enviar

 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;

public class FtpPassivoEnviar {
      public static void main (String[] args) throws SocketException,
                                                     IOException {
            System.getProperties().put( "ftpProxySet", "true" ); 
            System.getProperties().put( "ftpProxyHost", "ipproxy" ); 
            System.getProperties().put( "ftpProxyPort", "21" ); 
            System.getProperties().put("http.proxyUser", "loginproxy"); 
            System.getProperties().put("http.proxyPassword", "senhaproxy");
            FTPClient ftp = new FTPClient();
            ftp.connect( "ipftp" );
            ftp.login( "usuarioftp", "senhaftp" );
            FileInputStream arqEnviar =
                  new FileInputStream("/home/user/Downloads/mensagens666.txt");
            if (ftp.storeFile ("/public_html/mensagens666.txt", arqEnviar))
                  System.out.println("Arquivo armazenado com sucesso!");
            else
                  System.out.println ("Erro ao armazenar o arquivo.");
            
            
            ftp.logout();
            ftp.disconnect();
      }
      
}

Receber

 
  
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class FtpPassivoReceber {
      public static void main (String[] args) throws SocketException,
                                                     IOException {
            System.getProperties().put( "ftpProxySet", "true" ); 
            System.getProperties().put( "ftpProxyHost", "ipproxy" ); 
            System.getProperties().put( "ftpProxyPort", "21" ); 
            System.getProperties().put("http.proxyUser", "loginproxy"); 
            System.getProperties().put("http.proxyPassword", "senhaproxy");                                         
            FTPClient ftp = new FTPClient();
            ftp.connect( "ipftp" );
            ftp.login( "usuarioftp", "senhaftp" );
            if(FTPReply.isPositiveCompletion( ftp.getReplyCode() )){  
                System.out.println("....: Conectou");  
                ftp.enterLocalPassiveMode();
            } 
             
            ftp.changeWorkingDirectory ("/public_html");  
            System.out.print("....: "+ftp.getReplyString()); 
            System.out.println("....: Porta "+ftp.getDefaultPort());
             
            //String[] arq = ftp.listNames();
            FileOutputStream fos =
                    new FileOutputStream( "/home/usuario/Downloads/mensagens.txt" );
            if (ftp.retrieveFile( "mensagens.txt", fos ))
                  System.out.println("Download efetuado com sucesso!");
            else
                  System.out.println ("Erro ao efetuar download do arquivo.");
      
            
            ftp.logout();
            ftp.disconnect();
      }
      
}

Listar

 
 

  
import java.io.IOException;
import java.net.SocketException;
 import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
 public class FtpPassivoListar {
      public static void main (String[] args) throws SocketException,
                                                     IOException {
            System.getProperties().put( "ftpProxySet", "true" ); 
            System.getProperties().put( "ftpProxyHost", "ipproxy" ); 
            System.getProperties().put( "ftpProxyPort", "21" ); 
            System.getProperties().put("http.proxyUser", "login"); 
            System.getProperties().put("http.proxyPassword", "senha");
            FTPClient ftp = new FTPClient();
            ftp.connect( "ipftp" );
            ftp.login( "loginftp", "senhaftp" );
            System.out.print("....: "+ftp.getReplyString()); 
            if(FTPReply.isPositiveCompletion( ftp.getReplyCode() )){  
                System.out.println("....: Conectou");  
                ftp.enterLocalPassiveMode();
            } 
             
            ftp.changeWorkingDirectory ("/public_html");  
            System.out.print("....: "+ftp.getReplyString()); 
            System.out.println("....: Porta "+ftp.getDefaultPort()); 
            FTPFile[] files = ftp.listFiles();  
            System.out.println("....: Testando com FTPFile");  
            System.out.println("....: Quantidade["+files.length+"]");  
            String[] arq = ftp.listNames();  
            System.out.println("....: Testando com ftp.listNames()");  
            System.out.println("....: Quantidade["+arq.length+"]"); 
            System.out.println ("Listando arquivos: \n");
            for (String f : arq){
                  System.out.println(f);            
            }
            ftp.logout();
            ftp.disconnect();
      }
}

como dentro da rede programas como o filezzila e outros de ftp funcionam fico na duvida se falta algo pra funcionar.

Agradeco alguma dica

So pra constar

Fiz alguns testes agora e se eu tirar as configuracoes de proxy nao muda em nada o comportamento
inclusive envia os arquivos atraves do proxy

Amigo,

Sou iniciante em Java, ttenho pouco mais de um mês estudando e estou adorando!! Não sei se te ajudará, mais consegui realizar todas as operações através do FTP, da uma olhada no meu código.

PS.: Como fui testando as funcionalidades uma a uma, sugiro quando foir testar comentar as áreas que não for utilizar, tipo, se for listar comenta os codigos de upload e download, se for testar download, comenta lista e upload e etc… Espero poder ajudar, a comunidade tem me ajudade muito!!

PS.2.: Comentei também as áreas relacionadas ao proxy.

package estudoJava;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;

import javax.swing.JOptionPane;

import org.apache.commons.net.ftp.FTPClient;
  
     public class clienteFtp {   
     public static void main (String[] args) throws SocketException,   
                                                     IOException {   
            //System.getProperties().put( "ftpProxySet", "true" );   
            //System.getProperties().put( "ftpProxyHost", "ipproxy" );   
            //System.getProperties().put( "ftpProxyPort", "" );   
           // System.getProperties().put("http.proxyUser", "loginproxy");   
           // System.getProperties().put("http.proxyPassword", "senhaproxy");   
            
    	    FTPClient ftp = new FTPClient();   
            ftp.connect( "10.9.68.5" );   
            ftp.login( "transf", "transf" );  
            
            ftp.changeWorkingDirectory ("/transf/recebe/outros");
            //FTPFile[] files = ftp.listFiles();
            String[] arq = ftp.listNames(); 
            
            String lista = "";
            for (String f : arq){   
            	lista += f+"\n";
            	
            	System.out.println("Lista do diretório: "+f);           	           	
                
            
            }   

            JOptionPane.showMessageDialog(null, "Lista do Contéudo da Pasta: \n"+lista);


            FileInputStream arqEnviar = new FileInputStream("C:/Users/jlazaro/gerarLaudosPDF.pdf");   
            if (ftp.storeFile ("/transf/recebe/outros/gerarLaudosPDF.pdf", arqEnviar))   
                  System.out.println("Arquivo armazenado com sucesso!");   
           else   
                 System.out.println ("Erro ao armazenar o arquivo.");   
              
            
            FileOutputStream fos=new FileOutputStream( "C:/EFD_Setup.zip" );   
                    
                if (ftp.retrieveFile( "EFD_Setup.zip", fos ))   
           
                    	System.out.println("Download efetuado com sucesso!");   
            	else   System.out.println ("Erro ao efetuar download do arquivo.");   

            
               
            ftp.logout();   
            ftp.disconnect();   
      }   

     
    }  

obrigado pela resposta, meu problema acontece ao utilizar esse metodo atras de um proxy http autenticado, ate agora tudo q eu achei aponta para esse tipo de erro em uma conexao ftp ativa mas estou usando uma conexao passiva e ainda ssim operacoes como listar o servidor ftp e receber um arquivo nao funcionam, apenas o envio ao servidor funciona