Problème avec org.apache.commons.net.ftp.FTPClient listfiles ()
-
24-09-2019 - |
Question
La méthode listFiles()
de org.apache.commons.net.ftp.FTPClient
fonctionne très bien avec le serveur Filezilla sur 127.0.0.1, mais retourne null
dans le répertoire racine des serveurs FTP publics tels que belnet.be.
Il y a une question identique sur le lien ci-dessous, mais enterRemotePassiveMode()
ne semble pas aider.
Apache Commons FTPClient.listFiles
Pourrait-il être un problème avec l'analyse de la liste? Si oui, comment s'y prendre pour résoudre ce?
Edit: Voici un vidage de cache du répertoire:
Répertoire FileZilla Cache Dump
Dumping 1 répertoires mises en cache
Entry 1:
Path: /
Server: anonymous@ftp.belnet.be:21, type: 4096
Directory contains 7 items:
lrw-r--r-- ftp ftp D 28 2009-06-17 debian
lrw-r--r-- ftp ftp D 31 2009-06-17 debian-cd
-rw-r--r-- ftp ftp 0 2010-03-04 13:30 keepalive.txt
drwxr-xr-x ftp ftp D 4096 2010-02-18 14:22 mirror
lrw-r--r-- ftp ftp D 6 2009-06-17 mirrors
drwxr-xr-x ftp ftp D 4096 2009-06-23 packages
lrw-r--r-- ftp ftp D 1 2009-06-17 pub
Voici mon code à l'aide d'une enveloppe que je l'ai fait (essai dans l'emballage produit les mêmes résultats):
public static void main(String[] args) {
FTPUtils ftpUtils = new FTPUtils();
String ftpURL = "ftp.belnet.be";
Connection connection = ftpUtils.getFTPClientManager().getConnection( ftpURL );
if( connection == null ){
System.out.println( "Could not connect" );
return;
}
FTPClientManager manager = connection.getFptClientManager();
FTPClient client = manager.getClient();
try {
client.enterRemotePassiveMode();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if( connection != null ){
System.out.println( "Connected to FTP" );
connection.login("Anonymous", "Anonymous");
if( connection.isLoggedIn() ){
System.out.println( "Login successful" );
LoggedInManager loggedin = connection.getLoggedInManager();
System.out.println( loggedin );
String[] fileList = loggedin.getFileList();
System.out.println( loggedin.getWorkingDirectory() );
if( fileList == null || fileList.length == 0 )
System.out.println( "No files found" );
else{
for (String name : fileList ) {
System.out.println( name );
}
}
connection.disconnect();
if( connection.isDisconnected() )
System.out.println( "Disconnection successful" );
else
System.out.println( "Error disconnecting" );
}else{
System.out.println( "Unable to login" );
}
} else {
System.out.println( "Could not connect" );
}
}
produit cette sortie:
Connected to FTP
Login succesful
utils.ftp.FTPClientManager$Connection$LoggedInManager@156ee8e
null
No files found
Disconnection successful
A l'intérieur de l'enveloppe (tentative utilisant à la fois listNames()
et listFiles()
):
public String[] getFileList() {
String[] fileList = null;
FTPFile[] ftpFiles = null;
try {
ftpFiles = client.listFiles();
//fileList = client.listNames();
//System.out.println( client.listNames() );
} catch (IOException e) {
return null;
}
fileList = new String[ ftpFiles.length ];
for( int i = 0; i < ftpFiles.length; i++ ){
fileList[ i ] = ftpFiles[ i ].getName();
}
return fileList;
}
En ce qui concerne ClientFTP, elle est traitée comme suit:
public class FTPUtils {
private FTPClientManager clientManager;
public FTPClientManager getFTPClientManager(){
clientManager = new FTPClientManager();
clientManager.setClient( new FTPClient() );
return clientManager;
}
La solution
Chaque serveur FTP a une mise en page de la liste des fichiers différents (oui, il ne fait pas partie de la norme FTP, il est muet), et donc vous devez utiliser le FTPFileEntryParser
correct, que ce soit en spécifiant manuellement, ou en permettant CommonsFTP de détecter automatiquement il.
Auto-détection fonctionne généralement bien, mais parfois, il ne fonctionne pas, et vous devez le spécifier explicitement, par exemple.
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
FTPClient client = FTPClient();
client.configure(conf);
Ceci définit explicitement le type de serveur FTP prévu pour UNIX. Essayez les différents types, voir comment ça se passe. J'ai essayé de trouver moi-même, mais ftp.belnet.be
refuse mes connexions: (
Autres conseils
Avez-vous essayé de vérifier que vous pouvez lister les fichiers à l'aide client FTP normale? (Pour une raison quelconque, je ne peux même pas se connecter au port FTP de « belnet.be ».)
EDIT
Selon le javadoc pour listFiles () , l'analyse est effectuée en utilisant le l'instance de FTPFileEntryParser fournie par l'usine de l'analyseur. Vous avez probablement besoin de comprendre ce qui correspond à des parseurs la sortie LIST du serveur FTP et configurer l'usine en conséquence.
Il y avait un problème d'analyse syntaxique dans la version antérieure de apache-Commons-net, la commande SYST qui retourne le type de serveur lorsque renvoie NULL (brusquement) n'a pas été traitée dans parsingException. Essayez d'utiliser le dernier pot de apache-commons-net peut résoudre votre problème.