Install your FTP client, connect to your web server, configure settings, and make your first file transfer â step by step.
File Transfer Protocol, commonly known as FTP, is one of the oldest and most reliable protocols for moving files between computers over a network. Originally defined in RFC 959 back in 1985, FTP has powered countless website deployments, software distributions, and remote backup operations for nearly four decades. Even in an era dominated by Git-based deployment pipelines and cloud storage, FTP remains a staple tool for web developers working with shared hosting providers, legacy systems, and small to medium business websites.
At its core, FTP uses a client-server architecture. Your computer (the client) initiates a connection to a remote server that is running FTP server software. Once authenticated, you can list directories, upload new files, download existing ones, rename items, change permissions, and delete content â essentially performing the same filesystem operations you would locally, but on a machine that may be thousands of miles away.
FTP is unique in that it uses two separate channels for communication: a control channel on port 21 for commands and responses, and a data channel (traditionally port 20) for the actual file transfers. This dual-channel design is powerful but also the source of most firewall and NAT issues you will encounter.
$ ftp ftp.example.com
Connected to ftp.example.com.
220 Welcome to the FTP server
Name (ftp.example.com:user): webuser
331 Please specify the password.There are two FTP connection modes you must understand: Active mode and Passive mode. In Active mode, the client opens the control connection and the server initiates the data connection back to the client â a design that breaks when the client is behind a firewall or NAT router. In Passive mode (PASV), the client initiates both connections, which is why nearly every modern FTP client defaults to passive mode.
Common FTP commands you will see in logs include USER (send username), PASS (send password), PASV (enter passive mode), LIST (directory listing), RETR (retrieve/download a file), STOR (store/upload a file), DELE (delete), MKD (make directory), and QUIT (close session). Modern GUI clients hide these commands behind buttons, but knowing them helps enormously when troubleshooting.
Choosing the right FTP client depends on your operating system, your workflow, and whether you prefer a graphical interface or the command line. Three clients dominate the space in 2026: FileZilla, WinSCP, and Cyberduck. Each has strengths worth weighing before you commit.
FileZilla is the most widely recommended cross-platform FTP client. It runs on Windows, macOS, and Linux, supports FTP, FTPS, and SFTP, and includes a visual Site Manager, drag-and-drop transfers, resume support for interrupted uploads, directory comparison, and bookmarks. The interface uses a familiar dual-pane layout: local filesystem on the left, remote filesystem on the right, with a queue view at the bottom showing active and pending transfers. FileZilla is open source under the GPL and completely free.
WinSCP is a Windows-only client that many developers consider the gold standard on that platform. It supports FTP, FTPS, SFTP, SCP, and WebDAV, offers a Commander-style twin-panel interface or an Explorer-style single-pane view, includes a built-in text editor with syntax highlighting, scripting support via .ini and command-line parameters, and tight integration with PuTTY for key management. WinSCP is particularly loved for its directory synchronization features and ability to automate transfers.
Cyberduck is a free, open-source client for macOS and Windows with an elegant native interface that fits beautifully into macOS. Beyond classic FTP/SFTP, Cyberduck shines when connecting to cloud storage services like Amazon S3, Google Cloud Storage, Microsoft Azure, Backblaze B2, Dropbox, and OpenStack Swift â making it a hybrid tool for teams that straddle traditional hosting and cloud buckets.
Beyond these three, developers often reach for command-line clients such as the built-in ftp and sftp commands on Linux and macOS, lftp for scripted mirror operations, and curl for one-shot uploads inside shell scripts or CI pipelines. IDE integrations also matter: Visual Studio Code has popular extensions like SFTP by Natizyskunk, PhpStorm/WebStorm include built-in deployment, and Sublime Text has the SFTP package.
For the remainder of this guide we will use FileZilla as the primary example because it is the only tool that works identically across all three major operating systems. Everything we show you translates directly to WinSCP, Cyberduck, or any other mainstream client â the fields and concepts are the same.
Installing FileZilla is straightforward on every platform, but there are a few traps to avoid during setup â specifically bundled offers that appear in the official Windows installer. Here is a safe installation walkthrough for each operating system.
Windows installation: Visit https://filezilla-project.org/ and click "Download FileZilla Client". The site may offer multiple versions â pick the standard free edition, not FileZilla Pro (which costs money and adds cloud providers you likely do not need). Run the installer and watch each screen carefully: on at least one page the installer historically presents a third-party offer such as a browser toolbar or an unrelated utility. Decline these offers by selecting the "Decline" or "I do not accept" option before clicking Next.
# Alternative install with winget (no bundled offers)
winget install TimKosse.FileZilla.Client
filezilla --versionmacOS installation: Download the .app.tar.bz2 archive from the official site or install via Homebrew: brew install --cask filezilla. Drag FileZilla.app into /Applications. On first launch macOS Gatekeeper may warn that the app is from an unidentified developer â right-click the app and choose Open to approve it once.
Linux installation: On Debian or Ubuntu run sudo apt install filezilla. On Fedora or RHEL use sudo dnf install filezilla. On Arch Linux it is sudo pacman -S filezilla. Flatpak users can install from Flathub with flatpak install flathub org.filezillaproject.Filezilla.
Verify the install succeeded by opening FileZilla and checking the version in Help â About. In October 2026 the current stable branch is the 3.69.x series. If your version is older than 3.60, upgrade before continuing â older builds have known TLS and large-file bugs. Once installed, familiarize yourself with the interface: the message log at the top shows raw FTP commands and server responses, the local site pane on the left shows your computer's files, the remote site pane on the right shows the server, and the transfer queue at the bottom lists active and pending transfers.
Before you can connect, you need four pieces of information from your web host: the hostname, the port, your username, and your password. Depending on where you host, finding these can take seconds or a bit of hunting through control panels.
Hostname is typically something like ftp.yourdomain.com, yourdomain.com, or an IP address such as 192.0.2.45. Some hosts use shared FTP endpoints like ftp.hostingcompany.com where your account is isolated by username. Avoid using www.yourdomain.com as the FTP host â the www subdomain is for HTTP and may not resolve for FTP.
Port is 21 for plain FTP and FTPS (explicit TLS), 990 for implicit FTPS, and 22 for SFTP. Most shared hosts default to 21 with optional explicit TLS. If your host offers SFTP (which it should), prefer port 22.
Username and password are usually either the main hosting account credentials or a dedicated FTP user you create inside the control panel. Below are the exact locations for the most common hosting panels in 2026:
In cPanel, log in, scroll to the "Files" section, and click "FTP Accounts". The page shows your special FTP accounts and your main account. For the main account the hostname is usually your domain, the port is 21, and the password is your cPanel password. You can also create a limited-scope FTP user that only has access to a specific directory â this is best practice for giving contractors or deployment scripts access.
Host: ftp.example.com
Port: 21
User: [email protected]
Pass: [redacted]
Dir: /public_html/If your host does not provide a GUI panel, look in your welcome email â most hosts send FTP details right after signup. If you cannot find them, open a support ticket; a real human will typically reply within an hour at any reputable provider. Finally, note the server's starting directory. Many hosts place your public web root in /public_html, /htdocs, /www, or /httpdocs. Files uploaded elsewhere will not be reachable from the browser.
With credentials in hand, open FileZilla and connect. For a one-off test you can use the Quickconnect bar at the top of the window, but we recommend using the Site Manager from the start because it saves credentials, remembers settings, and lets you label each server.
Open the Site Manager with Ctrl+S (Windows/Linux) or Cmd+S (macOS), click "New Site", and give it a descriptive name like "ExampleCom-Production". Fill in these fields in the General tab:
Protocol: FTP - File Transfer Protocol
Host: ftp.example.com
Port: 21
Encryption: Require explicit FTP over TLS
Logon Type: Normal (or Ask for password for shared machines)
User: [email protected]
Password: âĸâĸâĸâĸâĸâĸâĸâĸâĸâĸâĸâĸAlways choose "Require explicit FTP over TLS" instead of plain FTP. Explicit TLS upgrades the connection to encrypted immediately after the initial handshake and keeps the standard port 21. If your host supports SFTP instead, change Protocol to SFTP - SSH File Transfer Protocol and port to 22 â SFTP is simpler, more secure, and far less finicky with firewalls.
Click Connect. The message log will scroll with the handshake. A successful connection looks something like this:
Status: Resolving address of ftp.example.com
Status: Connecting to 192.0.2.45:21...
Status: Connection established, waiting for welcome message...
Response: 220 ProFTPD Server (Example FTP) ready
Command: AUTH TLS
Response: 234 AUTH TLS successful
Status: Initializing TLS...
Status: TLS connection established
Command: USER [email protected]
Response: 230 Login successfulThe first time you connect to an FTPS or SFTP server, FileZilla will show the server's certificate or host-key fingerprint. Compare the fingerprint with the value in your hosting panel if available, then check "Always trust this certificate in future sessions" and click OK. This step prevents man-in-the-middle attacks on future connections.
If you see 530 Login incorrect, double-check the username format. Many shared hosts use user@domain rather than a bare username. If the login succeeds but you land in the wrong directory, open the Advanced tab in Site Manager and set the Default remote directory to /public_html or whichever folder your host uses as the web root.
Once connected, the right-hand pane in FileZilla shows your server's filesystem. The remote tree in the top-right lets you double-click folders to drill in; the file list below shows each entry's name, size, type, modification date, permissions, and owner. The left-hand pane mirrors the same layout for your local machine.
A typical shared hosting account looks like this when you first log in:
The public_html directory (sometimes called htdocs, www, or httpdocs) is where your website's publicly accessible files belong. Anything placed outside that directory is not reachable through the browser â useful for storing credentials, backups, and configuration you want kept private.
Common navigation shortcuts in FileZilla:
F5 Refresh current directory
Backspace Go up one level (parent folder)
Ctrl+F Find file by name
Right-click â View Open file in local editor
F2 Rename selected item
Delete Delete selected item (with confirmation)To view hidden files such as .htaccess or .env, enable Server â Force showing hidden files. Many servers hide dotfiles from directory listings by default, and overlooking an .htaccess rule is a classic source of "my site works locally but not on the server" bugs.
Pay close attention to the Permissions column. On Unix-like servers (which host over 95% of websites), each file has a nine-character permission string such as rw-r--r-- or an octal equivalent like 644. The three triplets represent read/write/execute rights for the owner, group, and world. Correct permissions matter: PHP files that are too permissive (777) will be rejected by many hosts for security, while files that are too restrictive (600) may not be readable by the web server. The usual defaults are 644 for files and 755 for directories.
With the connection established, let's upload a test file. Create a simple HTML file on your local machine called hello.html with the following content:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello FTP</title>
</head>
<body>
<h1>FTP upload successful â
</h1>
</body>
</html>In FileZilla, navigate the local pane to the folder containing hello.html, and the remote pane to /public_html/. There are three ways to transfer the file:
1. Drag and drop: grab the file from the local list and drop it on the remote list. This is the most intuitive method.
2. Right-click upload: right-click the file in the local pane and choose Upload. The transfer begins immediately and appears in the queue at the bottom of the window.
3. Double-click: double-clicking a file in the local pane uploads it to the current remote directory, and vice versa for downloads.
Watch the queue at the bottom. For a tiny HTML file the transfer will complete in milliseconds. For larger files you will see a progress bar, transfer speed in KB/s or MB/s, and estimated time remaining. Once the file is listed in the remote pane, open a browser and visit https://yourdomain.com/hello.html â you should see the "FTP upload successful" heading.
If a transfer is interrupted (network drop, laptop sleep), FileZilla can resume where it left off. When you re-queue the file, choose "Resume" in the overwrite prompt. This feature relies on server support for the REST command, which nearly all modern FTP servers include.
For bulk uploads, select multiple files in the local pane (Ctrl+Click or Shift+Click) and drag them over. FileZilla queues each file sequentially. If you need to transfer an entire folder, drop the folder itself â FileZilla recreates the directory structure on the server automatically.
After uploading, verify the file exists on the server by refreshing the remote pane (F5). Check the file size against your local copy â they should match exactly. A size mismatch almost always means the wrong transfer mode was used; re-upload in Binary mode to fix it.
With your first upload complete, the final step is dialing in two settings that trip up most beginners: passive mode and file permissions. Getting these right prevents the vast majority of day-to-day FTP headaches.
Passive mode configuration: If directory listings hang or large uploads stall at random, your client and server are disagreeing on connection mode. In FileZilla open Edit â Settings â Connection â FTP and set Transfer Mode to Passive. Under FTP â Passive mode leave the defaults in place â "Fall back to active mode" should be unchecked if your server supports passive (nearly all do).
Edit â Settings â Connection â FTP
Transfer Mode: Passive â
Fall back on failure: Unchecked
Edit â Settings â Connection â FTP â Passive mode
Use the server's external IP: CheckedWhy does this matter? In Active mode the server attempts to open a TCP connection back to your workstation on a high port. If you are behind a home router, a corporate firewall, or a Wi-Fi captive portal, that incoming connection is blocked and the transfer stalls. Passive mode flips the direction: your client opens both connections outward, which firewalls almost always allow.
File permissions in practice: On Linux hosts, permissions determine who can read, write, and execute each file. Change permissions in FileZilla by right-clicking a file and choosing File permissions. A dialog shows nine checkboxes and a numeric value. Standard safe values are:
644 Normal files (HTML, CSS, JS, PHP, images)
755 Directories and executable scripts
600 Private files (wp-config.php, .env)
700 Private directories (user-specific)
444 Read-only files (locked configuration)
777 NEVER use this on productionYou can also apply permissions recursively. Right-click a directory, choose File permissions, enter a numeric value, and tick "Recurse into subdirectories". Combine this with the "Apply to files only" or "Apply to directories only" options to assign 644 to all files and 755 to all folders in a single pass â a common first step after restoring a backup.
.htaccess, wp-config.php, or similar sensitive files can take your site offline. Tighten permissions one directory at a time and verify the site still loads after each change. Keep a backup within reach.Final checklist before you call it done: make sure your Site Manager entry uses explicit TLS or SFTP, that your password is stored only in your password manager (not pasted in chat), that passive mode is enabled, that public_html is your working remote directory, and that you can round-trip a file (upload, view in browser, download, delete). With those boxes checked, you have a professional FTP workflow ready for any project â from a weekend static site to a production WordPress deployment.