在Windows环境中,使用命令行工具(如cmd或PowerShell)通过FTP协议上传文件夹是一个常见需求,尤其对于需要批量处理文件或自动化脚本场景的用户,虽然传统的FTP命令行工具(如Windows自带的ftp.exe)不支持直接上传整个文件夹,但可以通过递归遍历文件夹结构并逐个上传文件来实现类似功能,以下是详细的操作步骤、命令示例及注意事项,帮助用户高效完成文件夹上传任务。

准备工作
在开始上传前,需确保以下条件已满足:
- FTP服务器信息:确认服务器的IP地址(或域名)、端口号、用户名及密码,以及目标上传路径的权限。
- 本地文件夹路径:明确需要上传的本地文件夹完整路径(如
D:\local_folder)。 - 网络连接:确保本地机器与FTP服务器之间的网络畅通,可通过
ping或telnet测试端口连通性。
使用传统FTP命令上传文件夹
Windows的ftp.exe工具是基础命令行FTP客户端,需通过批处理脚本实现文件夹递归上传,以下是具体步骤:
建立FTP连接
打开cmd窗口,输入以下命令连接FTP服务器(需替换为实际服务器信息):
ftp -s:ftp_commands.txt ftp.example.com
其中ftp_commands.txt是包含FTP命令的脚本文件,内容如下(需提前创建):

open ftp.example.com username password binary # 切换为二进制模式,避免文件损坏 prompt off # 关闭交互式提示,允许批量上传
编写递归上传脚本
由于ftp.exe不支持直接上传文件夹,需通过for循环遍历本地文件夹并逐个上传文件,以下是完整的批处理脚本示例(保存为upload_folder.bat):
@echo off
setlocal enabledelayedexpansion
set "local_folder=D:\local_folder"
set "remote_folder=/remote_path"
set "ftp_script=ftp_commands.txt"
:: 创建FTP命令脚本
(
echo open ftp.example.com
echo username
echo password
echo binary
echo prompt off
echo lcd "%local_folder%" # 切换本地目录
echo cd "%remote_folder%" # 切换远程目录
echo mput * :: 上传当前所有文件(非递归)
echo bye
) > "%ftp_script%"
:: 执行FTP上传
ftp -s:"%ftp_script%"
:: 清理临时脚本
del "%ftp_script%"
endlocal
注意:上述脚本仅上传指定文件夹内的直接文件,若需递归上传子文件夹,需结合for /r命令处理,改进版递归脚本如下:
@echo off
setlocal enabledelayedexpansion
set "local_root=D:\local_folder"
set "remote_root=/remote_path"
set "ftp_script=ftp_commands.txt"
:: 创建FTP命令脚本
(
echo open ftp.example.com
echo username
echo password
echo binary
echo prompt off
) > "%ftp_script%"
:: 遍历本地文件夹及子文件夹
for /r "%local_root%" %%f in (*) do (
set "relative_path=%%~pf"
set "relative_path=!relative_path:%local_root%=!"
set "remote_path=!remote_root!!relative_path!"
:: 确保远程目录存在(需FTP服务器支持MKDIR命令)
echo mkdir "!remote_path!" >> "%ftp_script%"
echo lcd "%%~dpf" >> "%ftp_script%"
echo cd "!remote_path!" >> "%ftp_script%"
echo mput "%%~nxf" >> "%ftp_script%"
)
echo bye >> "%ftp_script%"
ftp -s:"%ftp_script%"
del "%ftp_script%"
endlocal
局限性:递归脚本依赖服务器支持mkdir命令,且可能因路径分隔符(Windows用\,FTP用)导致错误,需手动调整。
常用FTP命令说明
| 命令 | 功能描述 | 示例 |
|---|---|---|
open |
连接FTP服务器 | open ftp.example.com |
lcd |
切换本地目录 | lcd D:\local_folder |
cd |
切换远程目录 | cd /remote_path |
put/mput |
上传单个/多个文件 | mput *.txt |
mkdir |
创建远程目录 | mkdir new_folder |
binary |
切换二进制模式(推荐用于文件) | binary |
prompt |
关闭/开启交互提示 | prompt off |
bye/quit |
断开连接 | bye |
替代方案:使用PowerShell或第三方工具
PowerShell(推荐)
PowerShell支持更强大的脚本处理,可直接递归上传文件夹,示例脚本:

$session = New-Object System.Net.FtpWebRequest.New("ftp://ftp.example.com/remote_path")
$session.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$session.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
Get-ChildItem -Path "D:\local_folder" -Recurse | ForEach-Object {
$request = [System.Net.FtpWebRequest]::Create("ftp://ftp.example.com/remote_path/$($_.Name)")
$request.Credentials = $session.Credentials
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
[System.IO.File]::ReadAllBytes($_.FullName) | $request.GetRequestStream().Write()
}
第三方工具(如FileZilla WinSCP)
若命令行操作复杂,可使用图形化工具(如FileZilla)或支持脚本的工具(如WinSCP),WinSCP示例脚本:
open sftp://username:password@ftp.example.com -hostkey="*" put D:\local_folder\* /remote_path/ -preservetime -recurse exit
通过WinSCP的/script参数执行脚本。
注意事项
- 安全性:FTP协议传输数据时未加密,建议使用SFTP(SSH)或FTPS(FTP over SSL)替代。
- 权限问题:确保FTP用户对目标路径有写入权限,否则会报“550 Permission denied”。
- 文件名编码:非ASCII文件名需确认服务器支持的编码(如UTF-8)。
- 网络稳定性:大文件或弱网络环境下,建议使用支持断点续传的工具(如WinSCP)。
相关问答FAQs
问题1:如何解决FTP上传时“550 Create directory operation failed”错误?
解答:该错误通常因远程目录权限不足或路径不存在导致,需确保:
- FTP用户对目标父目录有
CREATE权限; - 路径中的文件夹需提前创建(如通过
mkdir命令逐级创建); - 检查路径分隔符是否为(FTP标准),避免使用
\。
问题2:上传大文件时中断,如何实现断点续传?
解答:传统ftp.exe不支持断点续传,可改用以下方法:
- PowerShell:通过
-Resume参数(需.NET支持); - WinSCP:使用
resume命令(如put -resumepartially file.txt); - 第三方工具:如Curl支持
-C -参数(curl -T file.txt -u user:pass ftp://example.com/ -C -)。
