目录
- 第一步:准备工作(最重要!)
- 1 获取FTP服务器信息
- 2 安装FTP客户端(用于测试)
- 3 选择你的编程语言
- 第二步:使用命令行工具(无需编程)
- 1 Windows (PowerShell)
- 2 Linux / macOS
- 第三步:使用编程语言上传文件(代码实现)
- 1 Python (最推荐,简洁强大)
- 2 Node.js (适合Web应用)
- 3 Java (企业级应用)
- 4 PHP (Web开发常用)
- 第四步:高级技巧与最佳实践
- 1 处理错误和异常
- 2 上传整个文件夹
- 3 使用SFTP(更安全的替代方案)
- 4 关于FTP用户权限
- 总结与建议
第一步:准备工作(最重要!)
在写任何代码之前,你必须先确认以下信息,否则代码无法连接到服务器。

1 获取FTP服务器信息
联系你的服务器管理员或查看你的主机提供商(如阿里云、腾讯云、Bluehost等)的后台,获取以下信息:
- 主机名: 服务器的IP地址或域名(
ftp.yourdomain.com或168.1.100)。 - 用户名: 用于登录FTP账户的用户名。
- 密码: 对应的密码。
- 端口: FTP的默认端口是 21,有时服务器会使用其他端口(如2121)。SFTP的默认端口是22。
- 上传路径: 登录后,你的默认目录在哪里?你想把文件上传到哪个具体的文件夹下?(
/public_html/uploads/或/var/www/html/files/)
2 安装FTP客户端(用于测试)
在写代码之前,强烈建议你先用一个图形化的FTP客户端软件来测试连接和上传,确保你的服务器信息是正确的,并且你有上传文件的权限。
- FileZilla (免费、跨平台): https://filezilla-project.org/
使用你获取到的主机名、用户名、密码、端口进行连接,尝试上传一个文件,如果成功,说明你的环境是通的。
3 选择你的编程语言
根据你的项目需求选择合适的语言,下面我们以几种最常用的语言为例。

第二步:使用命令行工具(无需编程)
如果你只是想在服务器上通过脚本快速上传,可以使用命令行工具,这比写一个完整程序要快。
1 Windows (PowerShell)
现代Windows系统推荐使用PowerShell。
# 设置FTP服务器信息 $ftpUrl = "ftp://ftp.yourdomain.com/path/to/upload/" $user = "your_username" $pass = "your_password" $localFile = "C:\path\to\your\local\file.txt" $remoteFile = "file_on_server.txt" # 服务器上要保存的文件名 # 创建FTP请求对象 $request = [System.Net.FtpWebRequest]::Create($ftpUrl + $remoteFile) $request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile $request.Credentials = New-Object System.Net.NetworkCredential($user, $pass) # 读取本地文件为字节数组 $fileContent = [System.IO.File]::ReadAllBytes($localFile) $request.ContentLength = $fileContent.Length # 获取请求流并写入文件内容 $requestStream = $request.GetRequestStream() $requestStream.Write($fileContent, 0, $fileContent.Length) $requestStream.Close() # 获取响应 $response = $request.GetResponse() $responseStream = $response.GetResponseStream() $reader = New-Object System.IO.StreamReader($responseStream) $reader.ReadToEnd() $response.Close()
2 Linux / macOS
使用 curl 命令,非常方便。
# 设置FTP服务器信息
FTP_USER="your_username"
FTP_PASS="your_password"
FTP_SERVER="ftp.yourdomain.com"
REMOTE_PATH="/path/to/upload/"
LOCAL_FILE="/path/to/your/local/file.txt"
# 执行上传
# -u 指定用户名和密码
# -T 指定本地文件
curl -u ${FTP_USER}:${FTP_PASS} -T "${LOCAL_FILE}" "ftp://${FTP_SERVER}${REMOTE_PATH}"
第三步:使用编程语言上传文件(代码实现)
1 Python (最推荐,简洁强大)
Python的 ftplib 库是内置的,无需安装第三方库,非常方便。
代码示例 (ftp_upload.py):
import os
from ftplib import FTP
def upload_file(ftp_host, ftp_user, ftp_pass, local_path, remote_path):
"""
上传文件到FTP服务器
:param ftp_host: FTP服务器地址
:param ftp_user: 用户名
:param ftp_pass: 密码
:param local_path: 本地文件路径
:param remote_path: 服务器上保存的路径 (包括文件名)
"""
try:
# 1. 连接FTP服务器
print(f"正在连接到 {ftp_host}...")
ftp = FTP(ftp_host)
ftp.login(ftp_user, ftp_pass)
print("连接成功!")
# 2. 检查本地文件是否存在
if not os.path.exists(local_path):
print(f"错误:本地文件 {local_path} 不存在!")
return
# 3. 上传文件
# 使用二进制模式 'wb' (write binary) 上传文件,特别是图片、压缩包等
print(f"正在上传 {local_path} 到 {remote_path}...")
with open(local_path, 'rb') as file:
ftp.storbinary(f'STOR {remote_path}', file)
print("上传成功!")
except Exception as e:
print(f"上传过程中发生错误: {e}")
finally:
# 4. 确保连接被关闭
if 'ftp' in locals() and ftp.sock is not None:
ftp.quit()
print("FTP连接已关闭。")
# --- 使用示例 ---
if __name__ == "__main__":
# 请替换成你自己的FTP信息
ftp_server = "ftp.yourdomain.com"
ftp_username = "your_username"
ftp_password = "your_password"
# 本地文件路径
local_file = "C:/Users/YourUser/Desktop/my_image.png"
# 服务器上的路径 (/public_html/images/my_image.png)
remote_file = "/public_html/images/my_image.png"
upload_file(ftp_server, ftp_username, ftp_password, local_file, remote_file)
如何运行:
- 将代码保存为
ftp_upload.py。 - 修改
if __name__ == "__main__":部分的变量值。 - 打开终端或命令提示符,进入到文件所在目录。
- 运行命令:
python ftp_upload.py
2 Node.js (适合Web应用)
Node.js需要先安装一个FTP客户端库,basic-ftp 是一个现代、轻量且易于使用的选择。
安装库:
npm install basic-ftp
代码示例 (upload.js):
const { ftpConnect, ftpUpload } = require('basic-ftp');
const fs = require('fs');
const path = require('path');
async function uploadFile() {
const client = new ftpConnect.Client();
try {
// 1. 连接FTP服务器
console.log("正在连接到 FTP 服务器...");
await client.access({
host: "ftp.yourdomain.com",
user: "your_username",
password: "your_password",
});
console.log("连接成功!");
// 2. 准备文件
const localFilePath = "./my_document.pdf";
const remoteFilePath = "/public_html/documents/my_document.pdf";
// 3. 上传文件
console.log(`正在上传 ${localFilePath} 到 ${remoteFilePath}...`);
await client.uploadFrom(localFilePath, remoteFilePath);
console.log("上传成功!");
} catch (err) {
console.error("上传过程中发生错误:", err.message);
} finally {
// 4. 确保连接关闭
if (client.closed === false) {
client.close();
console.log("FTP连接已关闭。");
}
}
}
// --- 使用示例 ---
uploadFile();
如何运行:
- 安装
basic-ftp。 - 修改代码中的FTP信息。
- 运行命令:
node upload.js
3 Java (企业级应用)
Java需要使用Apache Commons Net库。
添加依赖 (Maven):
如果你使用Maven,在 pom.xml 中添加:
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.9.0</version> <!-- 使用最新版本 -->
</dependency>
代码示例 (FtpUpload.java):
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.io.FileInputStream;
import java.io.IOException;
public class FtpUpload {
public static void main(String[] args) {
String server = "ftp.yourdomain.com";
int port = 21;
String user = "your_username";
String pass = "your_password";
String localFilePath = "C:/path/to/your/local/file.txt";
String remoteFilePath = "/path/on/server/file.txt";
FTPClient ftpClient = new FTPClient();
try {
// 1. 连接服务器
System.out.println("正在连接到 " + server + "...");
ftpClient.connect(server, port);
System.out.println("连接成功,回复码: " + ftpClient.getReplyCode());
// 2. 登录
if (!ftpClient.login(user, pass)) {
System.out.println("登录失败。");
return;
}
System.out.println("登录成功!");
// 3. 设置文件类型为二进制(重要!)
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 4. 进入远程目录(可选)
// String remoteDir = "/public_html/";
// ftpClient.changeWorkingDirectory(remoteDir);
// 5. 上传文件
System.out.println("正在上传文件...");
try (FileInputStream fis = new FileInputStream(localFilePath)) {
if (ftpClient.storeFile(remoteFilePath, fis)) {
System.out.println("文件上传成功!");
} else {
System.out.println("文件上传失败,服务器回复: " + ftpClient.getReplyString());
}
}
} catch (IOException e) {
System.err.println("发生IO异常: " + e.getMessage());
} finally {
// 6. 断开连接
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
System.out.println("FTP连接已关闭。");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4 PHP (Web开发常用)
PHP内置了 ftp_ 系列函数,非常方便。
代码示例 (upload.php):
<?php
// FTP服务器信息
$ftp_server = "ftp.yourdomain.com";
$ftp_username = "your_username";
$ftp_password = "your_password";
// 本地和远程文件路径
$local_file = "local_image.jpg";
$remote_file = "/public_html/images/uploaded_image.jpg";
// 1. 连接FTP服务器
$conn_id = ftp_connect($ftp_server);
if ($conn_id) {
echo "成功连接到 $ftp_server\n";
// 2. 登录
$login_result = ftp_login($conn_id, $ftp_username, $ftp_password);
if ($login_result) {
echo "登录成功!\n";
// 3. 上传文件
// 使用 FTP_BINARY 模式上传二进制文件(图片、压缩包等)
if (ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) {
echo "文件 $local_file 成功上传到 $remote_file\n";
} else {
echo "上传文件时出错\n";
}
} else {
echo "登录失败!请检查用户名和密码,\n";
}
// 4. 关闭连接
ftp_close($conn_id);
echo "FTP连接已关闭,\n";
} else {
echo "无法连接到 $ftp_server\n";
}
?>
第四步:高级技巧与最佳实践
1 处理错误和异常
在上面的代码示例中,我们都使用了 try...catch (Java/Python/Node.js) 或 if 判断 (PHP) 来处理可能发生的错误(如网络中断、密码错误、文件不存在等),在实际应用中,完善的错误处理至关重要。
2 上传整个文件夹
上传文件夹需要递归地遍历本地文件夹的目录结构,并在服务器上创建对应的目录,然后逐个上传文件。
- Python: 可以使用
os.walk()遍历目录,使用ftp.mkd()创建远程目录。 - Node.js:
basic-ftp库的uploadFromDir()方法可以简化这个过程。 - Java/PHP: 同样需要先遍历本地目录,然后使用
ftp.mkd()创建远程目录,再上传文件。
3 使用SFTP(更安全的替代方案)
强烈建议 在任何新的项目中都使用 SFTP,而不是FTP。
- FTP: 数据(包括用户名和密码)都是明文传输的,非常不安全。
- SFTP: 基于SSH协议,所有数据都是加密传输的,安全得多。
大多数代码库都支持SFTP,通常只是将连接方式从 FTP 改为 SFTP 或 SSH。
- Python: 使用
paramiko或pysftp库。 - Node.js: 使用
ssh2-sftp-client库。 - Java: 使用 JSch 库。
- PHP: 使用
ssh2扩展(需要服务器安装并启用)。
4 关于FTP用户权限
为FTP程序创建一个专用的用户,并给予其最小的必要权限(只允许上传到指定目录,不允许浏览或修改其他目录),这样可以提高安全性。
总结与建议
| 语言 | 推荐库/方法 | 优点 | 缺点 |
|---|---|---|---|
| Python | ftplib (内置) |
简洁、易读、功能强大 | 无 |
| Node.js | basic-ftp |
现代、轻量、Promise支持好 | 需要安装第三方库 |
| Java | Apache Commons Net |
稳定、功能全面、适合企业级项目 | 代码相对冗长 |
| PHP | ftp_* 函数 (内置) |
与Web开发无缝集成 | 功能相对基础 |
给初学者的建议:
- 先测试连接: 无论如何,先用FileZilla等客户端工具确保你能连上服务器。
- 从Python开始: 如果你不确定用什么语言,Python的
ftplib是最容易上手和理解的。 - 优先考虑SFTP: 如果你的服务器支持,请务必使用SFTP来保护你的数据安全。
- 注意文件模式: 上传文本文件(如
.txt,.html)可以用ASCII模式,但上传图片、视频、压缩包等必须使用二进制模式,否则文件会损坏。
