本文目录导读:

可以使用多种脚本方式批量上传文件到FTP,下面提供几种常用方法(Windows和Linux环境均包含)。
Windows 批处理 + FTP 命令(原生方式)
准备 upload.txt(FTP 命令文件)
open ftp.example.com
username
password
binary
cd /remote/path
lcd C:\local\path
mput *.txt
quit
批处理脚本 ftp_upload.bat
@echo off ftp -s:upload.txt pause
说明:
mput *.txt上传所有.txt文件;mput *.*上传所有文件。
PowerShell 脚本(功能更强大)
# 配置参数
$ftpServer = "ftp.example.com"
$username = "user"
$password = "pass"
$localPath = "C:\Local\Folder\*"
$remotePath = "/remote/folder"
# 获取文件列表
$files = Get-ChildItem -Path $localPath
foreach ($file in $files) {
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($username, $password)
$uri = New-Object System.Uri("ftp://$ftpServer$remotePath/$($file.Name)")
$webclient.UploadFile($uri, $file.FullName)
Write-Host "Uploaded: $($file.Name)"
}
递归上传子文件夹(进阶版):
$ftp = "ftp://ftp.example.com/remote/folder"
$user = "user"
$pass = "pass"
$local = "C:\Local\Folder"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user, $pass)
Get-ChildItem -Path $local -Recurse -File | ForEach-Object {
$relativePath = $_.FullName.Substring($local.Length + 1)
$remoteUri = "$ftp/$($relativePath -replace '\\','/')"
$webclient.UploadFile($remoteUri, $_.FullName)
Write-Host "Uploaded: $relativePath"
}
Linux Shell 脚本(使用 ftp 或 curl)
方法 A:使用系统 ftp 命令
创建 upload.sh:
#!/bin/bash
FTP_SERVER="ftp.example.com"
USER="user"
PASS="pass"
LOCAL_DIR="/local/path/"
REMOTE_DIR="/remote/path"
# 生成临时命令文件
echo "open $FTP_SERVER" > ftp_cmds.txt
echo "user $USER $PASS" >> ftp_cmds.txt
echo "binary" >> ftp_cmds.txt
echo "cd $REMOTE_DIR" >> ftp_cmds.txt
echo "lcd $LOCAL_DIR" >> ftp_cmds.txt
# 添加所有文件(mput 只上传当前目录下的文件,不含子目录)
for file in "$LOCAL_DIR"*.ext; do
echo "put $(basename $file)" >> ftp_cmds.txt
done
echo "quit" >> ftp_cmds.txt
# 执行
ftp -n < ftp_cmds.txt
方法 B:使用 curl(推荐,支持更多协议)
#!/bin/bash
FTP_SERVER="ftp://ftp.example.com/remote/folder"
USER="user:PASS"
for file in /local/path/*.txt; do
curl -T "$file" -u "$USER" "$FTP_SERVER/"
echo "Uploaded: $file"
done
递归上传文件夹:
#!/bin/bash
FTP_SERVER="ftp://ftp.example.com/remote/folder"
USER="user:pass"
LOCAL_DIR="/local/path"
# 使用 find 递归查找所有文件
find "$LOCAL_DIR" -type f | while read file; do
# 计算相对路径
relpath="${file#$LOCAL_DIR/}"
# 上传到对应远程路径
curl -T "$file" -u "$USER" "$FTP_SERVER/$relpath"
echo "Uploaded: $relpath"
done
Python 脚本(最灵活,跨平台)
import ftplib
import os
def upload_files(ftp_host, username, password, remote_base, local_dir):
ftp = ftplib.FTP(ftp_host)
ftp.login(username, password)
for root, dirs, files in os.walk(local_dir):
for file in files:
local_path = os.path.join(root, file)
# 计算远程路径
rel_path = os.path.relpath(local_path, local_dir)
remote_path = f"{remote_base}/{rel_path.replace(os.sep, '/')}"
# 确保远程目录存在
remote_dir = os.path.dirname(remote_path)
try:
ftp.cwd(remote_dir)
except ftplib.error_perm:
# 创建不存在的远程目录
parts = remote_dir.split('/')
current = ''
for part in parts:
if part:
current += '/' + part
try:
ftp.cwd(current)
except ftplib.error_perm:
ftp.mkd(current)
# 上传文件
with open(local_path, 'rb') as f:
ftp.storbinary(f'STOR {remote_path}', f)
print(f"Uploaded: {remote_path}")
ftp.quit()
# 使用示例
upload_files(
'ftp.example.com',
'username',
'password',
'/remote/folder',
'/local/folder'
)
注意事项
- 被动模式:如果遇到连接问题,FTP 命令加
passive或代码中设置被动模式 - 二进制模式:上传非文本文件(图片、zip等)必须使用
binary模式 - 权限:确保 FTP 账号有目录写入权限
- 网络稳定:大批量文件建议增加重试机制
- 安全:避免在脚本中硬编码密码,可使用环境变量或配置文件
选择哪种方法取决于你的操作系统和需求:
- Windows 原生:用批处理
- Linux 简单使用:用
curl - 跨平台/复杂需求:用 Python
如果需要针对特定场景(如断点续传、加密传输)的解决方案,请补充说明。