In this article, you will learn how to deal with FTP, FTPS, and SFTP in Node.js. In detail, you will see how to upload and download a file via FTP/FTPS with basic-ftp
, and how to do the same via SFTP with ssh2-sftp-client
.
Let’s jump into it!
A Bit of Theory on FTP, FTPS, and SFTP
FTP (File Transfer Protocol), FTPS (FTP Secure), and SFTP (SSH File Transfer Protocol) are three different protocols for transferring files over the Internet. They all serve the same purpose but differ when it comes to the security they provide.
FTP is the oldest and most basic file transfer protocol. Since it transfers files in plain text, it is no longer considered secure.
FTPS is a secure version of FTP that uses SSL or TLS to secure the data being transferred.
SFTP uses an SSH connection for transferring files, making it the most secure file transfer protocol of the three.
Generally, FTP client libraries allow you to connect to both FTP and FTPS. On the contrary, SFTP requires specific libraries. This is also what typically happens in Node.js.
FTP/FTPS in Node.js
To connect to an FTP or FTPS server using Node.js, you can use basic-ftp
. As stated on the official GitHub page of the project, basic-ftp
is an FTP client library for Node.js that supports FTP, FTPS, and Passive Mode over IPv6.
First, install basic-ftp
with the following command:npm i basic-ftp
You can then use it to connect to an FTP or FTPS server, as in the following example:
// import basic-ftp const ftp = require("basic-ftp") // ESM: import * as ftp from "basic-ftp" // to activate the debug mode client.ftp.verbose = true async function operationWithFTP() { // initialize the FTP client const client = new ftp.Client() try { // connect to the FTP/FTPS server await client.access({ host: "<YOUR_FTP_HOST>", user: "<YOUR_FTP_USER>", password: "<YOUR_FTP_USER_PASSWORD>", secure: true // true for FTPS and false for FTP }) // perform operations on the FTP server... } catch(e) { console.log(e) } // close the client connection client.close() }
Be sure to replace the placeholder strings with your FTP credentials. Also, note that basic-ftp
is a Promise-based library. For this reason, its functions should be called with the await
keyword and in an async
function. Find out more about how to use Promise
s with async/await
in JavaScript.
Let’s learn how to upload and download a file with FTP and FTPS with basic-ftp
!
Download a File From FTP/FTPS server
You can create a function to download files from an FTP server withNode.js through basic-ftp
as follows:
const ftp = require("basic-ftp") async function downloadFileFromFTP(localFile, remotePath) { const client = new ftp.Client() try { await client.access({ host: "<YOUR_FTP_HOST>", user: "<YOUR_FTP_USER>", password: "<YOUR_FTP_USER_PASSWORD>", secure: true }) // download the remote file located to remotePath // and store it to localFile await client.downloadTo(localFile, remotePath) } catch(err) { console.log(err) } client.close() } // download the remote file "reports/CSV/data.csv" // and store it to the local file "data.csv" downloadFileFromFTP("data.csv", "reports/CSV/data.csv")
downloadTo()
will download a remote file from an FTP or FTPS server and pipe its data to a writable stream or local file. In detail, localFile
can be a Writable
Node.js stream or a string containing the complete local path of where to store the downloaded file.
Upload a File to an FTP/FTPS Server
Define a function to upload files to FTP/FTPS in Node.js with basic-ftp
as below:
const ftp = require("basic-ftp") async function uploadFileToFTP(localFile, remotePath) { const client = new ftp.Client() try { await client.access({ host: "<YOUR_FTP_HOST>", user: "<YOUR_FTP_USER_USERNAME>", password: "<YOUR_FTP_USER_PASSWORD>", secure: false }) // upload the local file located in localFile // to remotePath await client.uploadFrom(localFile, remotePath) } catch(err) { console.log(err) } client.close() } // upload the local file "report.xlxs" to // the remote path "reports/report.xlsx" uploadFileToFTP("report.xlsx", "reports/report.xlsx")
uploadFrom()
will upload data from a readable stream or local file to a remote file via FTP or FTPS. In particular, localFile
can be a Readable
Node.js stream or a string with the complete local path of the local file.
Note that if the remote file already exists, it will be overwritten.
SFTP in Node.js
ssh2-sftp-client
is a Promise-based SFTP client library for Node.js. Keep in mind that you cannot use it to connect to an FTP/FTPS server. Let’s now see how to use ssh2-sftp-client
to connect to an SFTP server using Node.js.
First, add ssh2-sftp-client
to your project’s dependencies with:npm i ssh2-sftp-client
Then, you can then use it to connect to SFTP as follows:
// import ssh2-sftp-client const SFTPClient = require("ssh2-sftp-client") // ESM: import SFTPClient from "ssh2-sftp-client" async function operationWithSFTP() { // initialize the SFTP client const sftp = new SFTPClient() try { // connect to the FTP/FTPS server await sftp.connect({ host: "<YOUR_SFTP_HOST>", username: "<YOUR_SFTP_USER_USERNAME>", password: "<YOUR_FTP_USER_PASSWORD>", }) // perform operations on the SFTP server... } catch(e) { console.log(e) } // close the client connection await sftp.close() }
Do not forget to replace the placeholder strings with your SFTP credentials.
It’s time to learn how to upload and download a file via SFTP with ssh2-sftp-client
!
Download a File From an SFTP Server
You can define a function to download a file from an SFTP server with Node.js through ssh2-sftp-client
as below:
const SFTPClient = require("ssh2-sftp-client") async function downloadFileFromSFTP(localFile, remotePath) { const sftp = new SFTPClient() try { await sftp.connect({ host: "<YOUR_SFTP_HOST>", username: "<YOUR_SFTP_USER_USERNAME>", password: "<YOUR_FTP_USER_PASSWORD>", }) // download the file located in remotePath // to localFile await sftp.get(remoteFile, localFile); } catch(e) { console.log(e) } // close the client connection await sftp.close() } // download the remote file "marketing/CSV/prices.csv" // and save it to the local file "prices.csv" downloadFileFromSFTP("prices.csv", "marketing/CSV/prices.csv")
get()
will download a remote file from an SFTP server and pipe its data to a buffer, writable stream, or local file. Specifically, localFile
can be a Buffer
, a Writable
stream, or a string with the complete local path of where to save the file downloaded via SFTP.
Upload a File to an SFTP Server
Create a function to upload a file to SFTP in Node.js with basic-ftp
as below:
const SFTPClient = require("ssh2-sftp-client") async function uploadFileToSFTP(localFile, remotePath) { const sftp = new SFTPClient() try { await sftp.connect({ host: "<YOUR_SFTP_HOST>", username: "<YOUR_SFTP_USER_USERNAME>", password: "<YOUR_FTP_USER_PASSWORD>", }) // upload the file located in localFile // to remoteFile await sftp.put(localFile, remoteFile); } catch(e) { console.log(e) } // close the client connection await sftp.close() } // upload the local file "data.xslx" // to store it to the remote file "marketing/Excel/data.xlsx" uploadFileToSFTP("data.xslx", "marketing/Excel/data.xlsx")
put()
will upload data from a buffer, readable stream, or local file to a remote file via SFTP. In detail, localFile
can be a Buffer
, Readable
stream or a string containing the complete local path of the local file.
Conclusion
In this article, you learned the difference between FTP, FTPS, and SFTP, and how to upload and download a file in each of those protocols. Specifically, you learned how to use basic-ftp
to deal with an FTP/FTPS server. Similarly, you saw how to use the ssh2-sftp-client
Node.js library to deal with an SFTP server. You know now how to upload and download files via FTP, FTPS, and SFTP in Node.js.
Thanks for reading! I hope you found this article helpful.