Pubblicato il 03/02/2024 da alnao nella categoria Java & Spring Boot

All’interno delle applicazioni J2EE è possibile creare connessioni verso Server FTP utilizzando il protocollo omonimo o il protocollo specifico più sicuro di tipo SFTP. Non esiste una unica libreria standard per effettuare questo tipo di connessioni. La libreria principale è stata implementata da apache e mette a disposizione i package:

import org.apache.commons.net.ftp

Con la libreria importabile nei file di configurazione pom.xml:

<dependency>
  <groupId>commons-net</groupId>
  <artifactId>commons-net</artifactId>
  <version>3.6</version>
</dependency>

Con questa libreria si può creare una connessione ad un server FTP (senza lo strato di sicurezza)

public void open() throws IOException {
  ftp = new FTPClient();
  ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
  ftp.connect(server, port);
  int reply = ftp.getReplyCode();
  if (!FTPReply.isPositiveCompletion(reply)) {
    ftp.disconnect();
    throw new IOException("Exception in connecting to FTP Server");
  }
  ftp.login(user, password);
}
public void close() throws IOException {
  ftp.disconnect();
}
public List<Object> listFiles(String path) throws IOException {
  FTPFile[] files = ftp.listFiles(path);
  return Arrays.stream(files)
    .map(FTPFile::getName)
    .collect(Collectors.toList());
}

Mentre per il protocollo SFTP esistono due librerie: JSch di jcraft e Vfs2 di apache, rispettivamente importabili nei progetti con le librerie:

<dependency>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <version>0.1.55</version>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-vfs2</artifactId>
  <version>2.9.0</version>
</dependency>

Con queste librerie è possibile usare il protocollo con le chiavi di sicurezza previste del protocollo SFTP, si rimanda alla documentazione ufficiale delle due librerie per maggiori dettagli. Con la libreria Vfs2 di Apache è possibile collegarsi ad un server remoto con poche righe di codice:

public List<String> ls(String path) throws Exception {
  StandardFileSystemManager fsManager = new StandardFileSystemManager();
  fsManager.init();//Initializes the file manager
  FileSystemOptions opts = new FileSystemOptions();
  SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
  String sftpUri = getConnection(path).toString() ;
  File[] identities = { new File(privateKey) };
  SftpFileSystemConfigBuilder.getInstance().setIdentities(opts, identities);
  FileObject localFileObject=fsManager .resolveFile (sftpUri, opts );
  FileObject[] children = localFileObject.getChildren();
  ArrayList<String> l=new ArrayList<String>();
  for ( int i = 0; i < children.length; i++ ){
    l.add ( children[ i ].getName().getBaseName() );
  } 
  fsManager.close();
  return l;
}

Gli esempi completi e funzio0nanti possono essere trovati in un mini-progetto al solito repository:

https://github.com/alnao/JavaExamples/tree/master/GenericJava/12FTP
MENU