La fondation Apache héberge un projet qui permet de se connecter simplement à un serveur FTP en Java. Parfois le simplement peu sembler être un concept très éloigné. 😉

Lorsqu’une application écrite en Java doit lister des fichiers sur un serveur FTP, il s’avère très pratique utiliser l’API Jakarta Commons Net.

Cas simple

Le code à écrire se révèle très simple :

FTPClient client = new FTPClient();
client.connect("dns_du_serveur_ftp");
client.login("user","password");
String[] names = client.listNames();
for(int i = 0; i < names.length; i++) {
	System.out.println("names["+i+"]="+names[i]);
}

Cas avancé

Parfois, il est nécessaire de récupérer plus d’information sur les fichiers présents sur le serveur FTP comme par exemple la taille ou la date de dernière modification. Dans ce cas il faut utiliser le code suivant :

FTPClient client = new FTPClient();
client.connect("dns_du_serveur_ftp");
client.login("user","password");
FTPFile[] files = client.listFiles();
for(int i = 0; i < files.length; i++) {
	System.out.println("files["+i+"]="+files[i].getName()+",size="+files[i].getSize()+",upd_date="+files[i].getTimestamp().getTime());
}

Problème

Or ce code ne fonctionne pas toujours. En effet, pour récupérer les informations le composant exécute un ls -lag sur le serveur FTP. Puis il tente d’analyser le résultat de cette commande. Mais selon les versions des serveurs FTP ou selon leur configuration, le composant n’est pas toujours capable d’extraire les informations. Il peut même être incapable de trouver les fichiers présents sur le serveur FTP !

Solution

Pour palier à ce problème, il est alors nécessaire de configurer soi-même le format des données retournées lors de l’exécution d’un ls -lag comme ci-dessous[1] :

FTPClient client = new FTPClient();
FTPClientConfig cfg = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
cfg.setServerLanguageCode("fr");
cfg.setShortMonthNames("jan|fev|mar|avr|mai|jun|jul|aoû|sep|oct|nov|déc");
cfg.setDefaultDateFormatStr("dd MMM yyyy");
cfg.setRecentDateFormatStr("dd MMM HH:mm");
client.configure(cfg);
client.connect("dns_du_serveur_ftp");
client.login("user","password");
FTPFile[] files = client.listFiles();
for(int i = 0; i < files.length; i++) {
	System.out.println("files["+i+"]="+files[i].getName()+",size="+files[i].getSize()+",upd_date="+files[i].getTimestamp().getTime());
}

Reportez-vous à la documentation JavaDoc de la classe FTPClientConfig pour découvrir l’ensemble des configurations possibles.

Notes

[1] Cet exemple permet de se connecter à un serveur FTP tournant sous AIX et configuré en français.