Mentransfer File Melalui SFTP di Java

1. Ikhtisar

Dalam tutorial ini, kita akan membahas cara mengupload dan mendownload file dari server jarak jauh menggunakan SFTP di Java .

Kami akan menggunakan tiga pustaka berbeda: JSch, SSHJ, dan Apache Commons VFS.

2. Menggunakan JSch

Pertama, mari kita lihat cara mengunggah dan mengunduh file dari server jauh menggunakan pustaka JSch.

2.1. Konfigurasi Maven

Kita perlu menambahkan ketergantungan jsch ke pom.xml kita :

 com.jcraft jsch 0.1.55 

Versi terbaru jsch dapat ditemukan di Maven Central.

2.2. Menyiapkan JSch

Sekarang, kami akan menyiapkan JSch.

JSch memungkinkan kita menggunakan Otentikasi Kata Sandi atau Otentikasi Kunci Publik untuk mengakses server jarak jauh. Dalam contoh ini, kami akan menggunakan otentikasi kata sandi :

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"); }

Dalam contoh di atas, remoteHost mewakili nama atau alamat IP dari server jarak jauh (mis. Example.com ). Kita dapat mendefinisikan variabel yang digunakan dalam pengujian sebagai:

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

Selain itu, kami dapat membuat file known_hosts menggunakan perintah berikut:

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

2.3. Mengupload File Dengan JSch

Sekarang, untuk mengunggah file ke server jarak jauh, kami akan menggunakan metode 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(); }

Dalam contoh ini, parameter pertama dari metode ini mewakili file lokal yang akan ditransfer, misalnya, src / main / resources / sample.txt, sedangkan remoteDir adalah jalur direktori target di server jarak jauh.

2.4. Mendownload File Dengan JSch

Kami juga dapat mengunduh file dari server jarak jauh menggunakan 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(); }

The remotefile adalah path file yang akan didownload, dan localDir merupakan jalan dari target direktori lokal:

3. Menggunakan SSHJ

Selanjutnya, kami akan menggunakan pustaka SSHJ untuk mengunggah dan mengunduh file dari server jarak jauh.

3.1. Konfigurasi Maven

Pertama, kami akan menambahkan ketergantungan ke pom.xml kami :

 com.hierynomus sshj 0.27.0 

Versi terbaru sshj dapat ditemukan di Maven Central.

3.2. Menyiapkan SSHJ

Selanjutnya, kami akan menyiapkan SSHClient .

SSHJ juga memungkinkan kita menggunakan Kata Sandi atau Otentikasi Kunci Publik untuk mengakses server jarak jauh.

Kami akan menggunakan Otentikasi Kata Sandi dalam contoh kami:

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

3.3. Mengupload File Dengan SSHJ

Mirip dengan JSch, kami akan menggunakan metode SFTPClient.put () untuk mengunggah file ke server jarak jauh :

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

Kami memiliki dua variabel baru di sini untuk ditentukan:

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

3.4. Mendownload File Dengan SSHJ

Hal yang sama berlaku untuk mengunduh file dari server jarak jauh - kami akan menggunakan 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(); }

Dan mari tambahkan dua variabel yang digunakan di atas:

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

4. Menggunakan 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(); }

Perhatikan bahwa jalur file lokal harus mutlak, dan jalur file jarak jauh harus dimulai dengan sftp: // username: [email protected]

4.3. Mendownload File Dengan Apache Commons VFS

Mengunduh file dari server jarak jauh sangat mirip - kami juga akan menggunakan FileObject.copyFrom () untuk menyalin localFile dari 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. Kesimpulan

Dalam artikel ini, kami mempelajari cara mengupload dan mendownload file dari server SFTP jarak jauh di Java. Untuk ini, kami menggunakan beberapa pustaka: JSch, SSHJ, dan Apache Commons VFS.

Kode sumber lengkap dapat ditemukan di GitHub.