Transfert d'un fichier via SFTP en Java

1. Vue d'ensemble

Dans ce didacticiel, nous verrons comment charger et télécharger des fichiers à partir d'un serveur distant à l'aide de SFTP en Java .

Nous utiliserons trois bibliothèques différentes: JSch, SSHJ et Apache Commons VFS.

2. Utilisation de JSch

Voyons d'abord comment charger et télécharger des fichiers depuis un serveur distant à l'aide de la bibliothèque JSch.

2.1. Configuration Maven

Nous devrons ajouter la dépendance jsch à notre pom.xml :

 com.jcraft jsch 0.1.55 

La dernière version de jsch est disponible sur Maven Central.

2.2. Configuration de JSch

Maintenant, nous allons configurer JSch.

JSch nous permet d'utiliser l'authentification par mot de passe ou l'authentification par clé publique pour accéder à un serveur distant. Dans cet exemple, nous utiliserons l'authentification par mot de passe :

private ChannelSftp setupJsch() throws JSchException { JSch jsch = new JSch(); jsch.setKnownHosts("/Users/john/.ssh/known_hosts"); Session jschSession = jsch.getSession(username, remoteHost); jschSession.setPassword(password); jschSession.connect(); return (ChannelSftp) jschSession.openChannel("sftp"); }

Dans l'exemple ci-dessus, le remoteHost représente le nom ou l'adresse IP du serveur distant (par exemple, example.com ). Nous pouvons définir les variables utilisées dans le test comme:

private String remoteHost = "HOST_NAME_HERE"; private String username = "USERNAME_HERE"; private String password = "PASSWORD_HERE";

De plus, nous pouvons générer le fichier known_hosts à l'aide de la commande suivante:

ssh-keyscan -H -t rsa REMOTE_HOSTNAME >> known_hosts

2.3. Télécharger un fichier avec JSch

Maintenant, pour télécharger un fichier sur le serveur distant, nous allons utiliser la méthode ChannelSftp.put () :

@Test public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException { ChannelSftp channelSftp = setupJsch(); channelSftp.connect(); String localFile = "src/main/resources/sample.txt"; String remoteDir = "remote_sftp_test/"; channelSftp.put(localFile, remoteDir + "jschFile.txt"); channelSftp.exit(); }

Dans cet exemple, le premier paramètre de la méthode représente le fichier local à transférer, par exemple, src / main / resources / sample.txt, tandis que remoteDir est le chemin du répertoire cible sur le serveur distant.

2.4. Téléchargement d'un fichier avec JSch

Nous pouvons également télécharger un fichier depuis le serveur distant en utilisant ChannelSftp.get () :

@Test public void whenDownloadFileUsingJsch_thenSuccess() throws JSchException, SftpException { ChannelSftp channelSftp = setupJsch(); channelSftp.connect(); String remoteFile = "welcome.txt"; String localDir = "src/main/resources/"; channelSftp.get(remoteFile, localDir + "jschFile.txt"); channelSftp.exit(); }

Le RemoteFile est le chemin du fichier à télécharger, et localdir représente le chemin de la cible répertoire local:

3. Utilisation de SSHJ

Ensuite, nous utiliserons la bibliothèque SSHJ pour télécharger et télécharger des fichiers à partir d'un serveur distant.

3.1. Configuration Maven

Tout d'abord, nous allons ajouter la dépendance à notre pom.xml :

 com.hierynomus sshj 0.27.0 

La dernière version de sshj est disponible sur Maven Central.

3.2. Configuration de SSHJ

Ensuite, nous allons configurer le SSHClient .

SSHJ nous permet également d'utiliser l'authentification par mot de passe ou par clé publique pour accéder au serveur distant.

Nous utiliserons l'authentification par mot de passe dans notre exemple:

private SSHClient setupSshj() throws IOException { SSHClient client = new SSHClient(); client.addHostKeyVerifier(new PromiscuousVerifier()); client.connect(remoteHost); client.authPassword(username, password); return client; }

3.3. Téléchargement d'un fichier avec SSHJ

Semblable à JSch, nous utiliserons la méthode SFTPClient.put () pour télécharger un fichier sur le serveur distant :

@Test public void whenUploadFileUsingSshj_thenSuccess() throws IOException { SSHClient sshClient = setupSshj(); SFTPClient sftpClient = sshClient.newSFTPClient(); sftpClient.put(localFile, remoteDir + "sshjFile.txt"); sftpClient.close(); sshClient.disconnect(); }

Nous avons ici deux nouvelles variables à définir:

private String localFile = "src/main/resources/input.txt"; private String remoteDir = "remote_sftp_test/";

3.4. Téléchargement d'un fichier avec SSHJ

Il en va de même pour le téléchargement d'un fichier à partir du serveur distant - nous utiliserons SFTPClient.get () :

@Test public void whenDownloadFileUsingSshj_thenSuccess() throws IOException { SSHClient sshClient = setupSshj(); SFTPClient sftpClient = sshClient.newSFTPClient(); sftpClient.get(remoteFile, localDir + "sshjFile.txt"); sftpClient.close(); sshClient.disconnect(); }

Et ajoutons les deux variables utilisées ci-dessus:

private String remoteFile = "welcome.txt"; private String localDir = "src/main/resources/";

4. Utilisation d'Apache Commons VFS

Finally, we'll use Apache Commons VFS to transfer files to a remote server.

Actually, Apache Commons VFS uses JSch library internally.

4.1. Maven Configuration

We need to add the commons-vfs2 dependency to our pom.xml:

 org.apache.commons commons-vfs2 2.4 

The latest version of commons-vfs2 can be found on Maven Central.

4.2. Uploading a File With Apache Commons VFS

Apache Commons VFS is a little different.

We'll use a FileSystemManager to create FileObjects from our target files, then use the FileObjects to transfer our files.

In this example, we'll upload a file by using method FileObject.copyFrom():

@Test public void whenUploadFileUsingVfs_thenSuccess() throws IOException { FileSystemManager manager = VFS.getManager(); FileObject local = manager.resolveFile( System.getProperty("user.dir") + "/" + localFile); FileObject remote = manager.resolveFile( "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt"); remote.copyFrom(local, Selectors.SELECT_SELF); local.close(); remote.close(); }

Notez que le chemin du fichier local doit être absolu et que le chemin du fichier distant doit commencer par sftp: // username: [email protected]

4.3. Téléchargement d'un fichier avec Apache Commons VFS

Le téléchargement d'un fichier depuis un serveur distant est très similaire - nous utiliserons également FileObject.copyFrom () pour copier localFile depuis remoteFile :

@Test public void whenDownloadFileUsingVfs_thenSuccess() throws IOException { FileSystemManager manager = VFS.getManager(); FileObject local = manager.resolveFile( System.getProperty("user.dir") + "/" + localDir + "vfsFile.txt"); FileObject remote = manager.resolveFile( "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteFile); local.copyFrom(remote, Selectors.SELECT_SELF); local.close(); remote.close(); }

5. Conclusion

Dans cet article, nous avons appris à charger et télécharger des fichiers à partir d'un serveur SFTP distant en Java. Pour cela, nous avons utilisé plusieurs bibliothèques: JSch, SSHJ et Apache Commons VFS.

Le code source complet est disponible à l'adresse over sur GitHub.