怎样用脚本批量上传文件到FTP?

wen 实用脚本 2

本文目录导读:

怎样用脚本批量上传文件到FTP?

  1. Windows 批处理 + FTP 命令(原生方式)
  2. PowerShell 脚本(功能更强大)
  3. Linux Shell 脚本(使用 ftpcurl
  4. Python 脚本(最灵活,跨平台)
  5. 注意事项

可以使用多种脚本方式批量上传文件到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 脚本(使用 ftpcurl

方法 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'
)

注意事项

  1. 被动模式:如果遇到连接问题,FTP 命令加 passive 或代码中设置被动模式
  2. 二进制模式:上传非文本文件(图片、zip等)必须使用 binary 模式
  3. 权限:确保 FTP 账号有目录写入权限
  4. 网络稳定:大批量文件建议增加重试机制
  5. 安全:避免在脚本中硬编码密码,可使用环境变量或配置文件

选择哪种方法取决于你的操作系统和需求:

  • Windows 原生:用批处理
  • Linux 简单使用:用 curl
  • 跨平台/复杂需求:用 Python

如果需要针对特定场景(如断点续传、加密传输)的解决方案,请补充说明。

抱歉,评论功能暂时关闭!