Een bestand overbrengen via SFTP in Java

1. Overzicht

In deze tutorial we zullen bespreken hoe u bestanden kunt uploaden en downloaden van een externe server met behulp van SFTP in Java.

We gebruiken drie verschillende bibliotheken: JSch, SSHJ en Apache Commons VFS.

2. JSch gebruiken

Laten we eerst eens kijken hoe we bestanden van een externe server kunnen uploaden en downloaden met behulp van de JSch-bibliotheek.

2.1. Maven-configuratie

We moeten het jsch afhankelijkheid van onze pom.xml:

 com.jcraft jsch 0.1.55 

De nieuwste versie van jsch is te vinden op Maven Central.

2.2. JSch instellen

Nu gaan we JSch opzetten.

JSch stelt ons in staat om wachtwoordverificatie of openbare sleutelverificatie te gebruiken om toegang te krijgen tot een externe server. In dit voorbeeld we gebruiken wachtwoordverificatie:

private ChannelSftp setupJsch () gooit JSchException {JSch jsch = nieuwe JSch (); jsch.setKnownHosts ("/ Users / john / .ssh / bekende_hosts"); Sessie jschSession = jsch.getSession (gebruikersnaam, remoteHost); jschSession.setPassword (wachtwoord); jschSession.connect (); return (ChannelSftp) jschSession.openChannel ("sftp"); }

In het bovenstaande voorbeeld is de remoteHost staat voor de naam of het IP-adres van de externe server (d.w.z. example.com). We kunnen de variabelen die in de test worden gebruikt, definiëren als:

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

We kunnen ook het bekende_hosts bestand met de volgende opdracht:

ssh-keyscan -H -t rsa REMOTE_HOSTNAAM >> bekende_hosts

2.3. Een bestand uploaden met JSch

Nu, om een ​​bestand naar de externe server te uploaden, gebruiken we de methode ChannelSftp.put ():

@Test openbare leegte whenUploadFileUsingJsch_thenSuccess () gooit 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 (); }

In dit voorbeeld vertegenwoordigt de eerste parameter van de methode het lokale bestand dat moet worden overgedragen, bijvoorbeeld src / main / resources / sample.txt, terwijl remoteDir is het pad van de doelmap op de externe server.

2.4. Een bestand downloaden met JSch

We kunnen ook download een bestand van de externe server met KanaalSftp.get ():

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

De remoteFile is het pad van het te downloaden bestand, en localDir vertegenwoordigt het pad van de lokale doelmap:

3. SSHJ gebruiken

Vervolgens gebruiken we de SSHJ-bibliotheek om bestanden van een externe server te uploaden en downloaden.

3.1. Maven-configuratie

Eerst voegen we de afhankelijkheid toe aan ons pom.xml:

 com.hierynomus sshj 0.27.0 

De nieuwste versie van sshj is te vinden op Maven Central.

3.2. SSHJ instellen

De volgende, we zullen de SSHClient.

SSHJ stelt ons ook in staat om wachtwoord- of openbare sleutelverificatie te gebruiken om toegang te krijgen tot de externe server.

We gebruiken de wachtwoordverificatie in ons voorbeeld:

private SSHClient setupSshj () gooit IOException {SSHClient client = nieuwe SSHClient (); client.addHostKeyVerifier (nieuwe PromiscuousVerifier ()); client.connect (remoteHost); client.authPassword (gebruikersnaam, wachtwoord); klant teruggeven; }

3.3. Een bestand uploaden met SSHJ

Net als bij JSch, we zullen de SFTPClient.put () methode om een ​​bestand naar de externe server te uploaden:

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

We hebben hier twee nieuwe variabelen om te definiëren:

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

3.4. Een bestand downloaden met SSHJ

Hetzelfde geldt voor het downloaden van een bestand van de externe server - we gebruiken SFTPClient.get ():

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

En laten we de twee hierboven gebruikte variabelen toevoegen:

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

4. Apache Commons VFS gebruiken

Ten slotte gebruiken we Apache Commons VFS om bestanden naar een externe server over te brengen.

Werkelijk, Apache Commons VFS gebruikt intern de JSch-bibliotheek.

4.1. Maven-configuratie

We moeten de commons-vfs2 afhankelijkheid van onze pom.xml:

 org.apache.commons commons-vfs2 2.4 

De nieuwste versie van commons-vfs2 is te vinden op Maven Central.

4.2. Een bestand uploaden met Apache Commons VFS

Apache Commons VFS is een beetje anders.

We gebruiken een FileSystemManager maken FileObjects van onze doelbestanden, gebruik dan de FileObjects om onze bestanden over te dragen.

In dit voorbeeld zullen we een bestand uploaden met behulp van method FileObject.copyFrom ():

@Test openbare leegte whenUploadFileUsingVfs_thenSuccess () gooit IOException {FileSystemManager manager = VFS.getManager (); FileObject local = manager.resolveFile (System.getProperty ("user.dir") + "/" + localFile); FileObject remote = manager.resolveFile ("sftp: //" + gebruikersnaam + ":" + wachtwoord + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt"); remote.copyFrom (lokaal, Selectors.SELECT_SELF); local.close (); remote.close (); }

Merk op dat het lokale bestandspad absoluut moet zijn, en het externe bestandspad moet beginnen met sftp: // gebruikersnaam: [e-mail beveiligd]

4.3. Een bestand downloaden met Apache Commons VFS

Het downloaden van een bestand van een externe server lijkt sterk op - we zullen ook gebruiken FileObject.copyFrom () kopiëren localFile van remoteFile:

@ Test openbare leegte whenDownloadFileUsingVfs_thenSuccess () gooit IOException {FileSystemManager manager = VFS.getManager (); FileObject local = manager.resolveFile (System.getProperty ("user.dir") + "/" + localDir + "vfsFile.txt"); FileObject remote = manager.resolveFile ("sftp: //" + gebruikersnaam + ":" + wachtwoord + "@" + remoteHost + "/" + remoteFile); local.copyFrom (remote, Selectors.SELECT_SELF); local.close (); remote.close (); }

5. Conclusie

In dit artikel hebben we geleerd hoe u bestanden kunt uploaden en downloaden vanaf een externe SFTP-server in Java. Hiervoor hebben we meerdere bibliotheken gebruikt: JSch, SSHJ en Apache Commons VFS.

De volledige broncode is te vinden op GitHub.