15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
09.10.2024

如何使用FTP上传文件:完整技术指南

文件传输协议(FTP)是一种基于客户端-服务器模型运行的网络协议,能够通过TCP/IP在本地计算机和远程主机之间实现双向文件传输。它使用两个独立的通道——用于命令的控制通道(端口21)和用于实际文件传输的数据通道(端口20或协商的临时端口)——这是一个基本的架构细节,解释了从业者遇到的大多数防火墙和被动模式问题。

对于任何管理Web服务器、部署应用程序代码或管理VPS Hosting环境的人来说,掌握FTP及其安全继任者是必不可少的。本指南涵盖完整工作流程:协议选择、客户端配置、目录导航、批量传输、权限管理以及生产级故障排除——包括通用教程中省略的边缘情况。

了解FTP架构和协议变体

在使用客户端之前,了解您实际使用的协议变体可以避免日后数小时的调试工作。

主动模式与被动模式

FTP的双通道设计造成了一个关键的行为差异:

  • 主动模式:服务器在客户端指定的端口上主动向客户端发起数据连接。由于来自服务器的入站连接被阻止,这种方式几乎总是在NAT路由器或严格防火墙环境下失败。
  • 被动模式(PASV):客户端主动发起两个连接。服务器开放一个随机高端口并告知客户端连接到该端口。这是几乎所有现代部署的正确默认设置。

生产环境中大多数连接失败源于对有防火墙保护的服务器使用主动模式,或服务器自身防火墙规则中未开放被动端口范围。

协议对比表

功能FTPFTPS(FTP over TLS)SFTP(SSH文件传输)SCP
加密TLS/SSLSSHSSH
控制通道端口2121(显式)/ 990(隐式)2222
数据通道独立(20/临时端口)独立(TLS加密)单一多路复用通道单一通道
防火墙友好性优秀优秀
断点续传支持(REST命令)支持支持不支持
目录列表支持支持支持不支持
需要证书是(最低需服务器端证书)否(密钥或密码)
推荐用于生产环境视情况而定是(批量复制)

实际建议:默认使用SFTP。仅在旧系统明确要求时使用FTPS。在任何面向互联网的服务器上完全避免使用纯FTP——凭据和文件内容以明文传输,极易被截获。

前提条件与凭据收集

在打开任何客户端之前,请从您的托管服务提供商或服务器管理员处收集以下信息:

  • 主机名或IP地址——例如 ftp.yourdomain.com203.0.113.45
  • 协议——FTP、FTPS(显式或隐式)或SFTP
  • 端口——FTP/FTPS显式为21,FTPS隐式为990,SFTP为22
  • 用户名和密码——或用于SFTP基于密钥认证的SSH私钥
  • 远程根路径——通常为 /public_html/var/www/html/home/username/public_html,具体取决于服务器技术栈

如果您使用的是带cPanel的VPS,您的FTP凭据可在cPanel > FTP账户下创建,您还可以将每个账户的访问范围限定到特定目录——这是一种安全实践,可在凭据泄露时限制影响范围。

第一步:安装并配置FileZilla

FileZilla仍然是使用最广泛的跨平台FTP客户端,因为它支持FTP、FTPS和SFTP,内置站点管理器,并具有带断点续传功能的传输队列。

下载:filezilla-project.org 获取FileZilla客户端(非服务器端)。在执行安装程序之前,验证下载页面上发布的SHA-512校验和——这是大多数教程跳过的步骤,但针对流行工具的供应链攻击已有记录在案。

安装完成后,打开FileZilla并导航至编辑 > 设置 > 传输 > 文件类型。将默认传输类型设置为二进制,而非自动。自动检测可能在启发式算法错误分类文件时,通过应用行尾转换而悄无声息地损坏二进制文件(图像、压缩包、可执行文件)。

第二步:创建站点管理器条目

使用快速连接栏适合一次性任务,但它会将凭据以明文形式存储在 recentservers.xml 中。对于任何重复性连接,请改用站点管理器。

  1. 打开文件 > 站点管理器(或按 Ctrl+S)。
  2. 点击新建站点并为其命名一个描述性名称。
  3. 配置常规选项卡:
  • 协议:对于基于SSH的服务器选择SFTP,或选择带显式TLS的FTP用于FTPS。
  • 主机:输入服务器主机名或IP。
  • 端口:留空以使用协议默认端口,或明确指定。
  • 登录类型:密码认证选择正常,SSH密钥认证的SFTP选择密钥文件
  • 用户名/密码:输入凭据。
  1. 高级选项卡中,将默认远程目录设置为您的Web根目录(例如 /public_html),将默认本地目录设置为您的项目文件夹。这样可以节省每次会话的导航时间。
  2. 点击连接

对于使用基于密钥认证的SFTP——这是独立服务器的推荐方式——将密钥文件字段指向您的私钥(.pem.ppk 格式)。FileZilla使用其自有密钥格式;如需要,请使用PuTTYgen转换OpenSSH密钥。

第三步:导航双窗格界面

连接后,FileZilla呈现分屏视图:

  • 左侧窗格(本地站点):您的本地文件系统。导航到包含要上传文件的目录。
  • 右侧窗格(远程站点):服务器的文件系统。导航到目标目录——通常是Web内容的 /public_html
  • 底部队列面板:显示已排队的传输、失败的传输以及成功的传输(含时间戳和字节数)。

每个窗格顶部的目录树与其下方的文件列表是独立的——点击目录树中的文件夹不会自动滚动文件列表。这会让新用户困惑为何文件列表显示为空。

第四步:上传文件

单个文件或手动选择

右键点击本地窗格中的任意文件并选择上传,或将其拖动到远程窗格。对于多文件选择,使用 Ctrl+Click(Windows/Linux)或 Cmd+Click(macOS)进行非连续选择,或使用 Shift+Click 进行范围选择。

拖放上传

在本地窗格中选择文件并将其拖动到远程窗格中的目标文件夹。FileZilla会将所有项目加入队列并立即开始传输。

同步目录上传

要部署整个项目目录,右键点击本地文件夹并选择上传。FileZilla会递归上传所有内容,并在远程端保留目录结构。

监控传输进度

底部的传输队列显示:

  • 文件名和大小
  • 传输速度(字节/秒)
  • 已用时间和预计剩余时间
  • 远程目标路径

传输完成但显示传输了0字节是一种静默失败——文件已创建但内容为空。这通常表明目标目录存在权限问题或服务器磁盘配额已满。

第五步:上传后设置正确的文件权限

这是最常被跳过的步骤,也是大量”上传后网站出现故障”支持工单的根源。

上传后,右键点击远程窗格中的文件或目录并选择文件权限。数字表示直接对应Unix权限八进制值:

  • 644——Web文件的标准权限(所有者读/写,组/其他只读)
  • 755——目录和可执行脚本的标准权限
  • 600——不应通过Web访问的私有文件(例如包含凭据的配置文件)
  • 777——生产环境中绝对不要使用;它授予所有人写入权限

对整个已上传目录树进行递归权限修复时,勾选递归进入子目录,并分别对文件应用644、对目录应用755。FileZilla在单次递归操作中无法区分文件和目录——您必须使用相应的过滤器运行两次。

或者,通过SSH连接后,批量修复权限:

find /public_html -type f -exec chmod 644 {} ;
find /public_html -type d -exec chmod 755 {} ;

第六步:验证上传结果

不要假设传输队列完成就意味着部署正确。请执行以下验证步骤:

  1. 在FileZilla中:刷新远程目录(F5 或右键点击 > 刷新),确认文件大小与本地原始文件一致。大小不匹配表明传输被截断。
  2. 通过浏览器:加载更新后的页面并执行强制刷新(Ctrl+Shift+R)以绕过浏览器缓存。
  3. 通过SSH:对于服务器端验证,比较校验和:
md5sum /public_html/index.html

将输出与本地文件的校验和进行比较。不匹配意味着文件在传输过程中损坏——使用SFTP时极少发生,但在不稳定连接上使用纯FTP时可能出现。

高级技术与生产模式

恢复失败的传输

如果大文件传输被中断,FileZilla使用FTP的 REST 命令(或SFTP的等效命令)从最后确认的字节偏移量处续传。在失败的传输选项卡中,右键点击失败的项目并选择重置并重新排队失败的文件,然后重新启动队列。这在SFTP中可靠运行;纯FTP续传取决于服务器对 REST 命令的支持。

排除文件不上传

FileZilla的编辑 > 文件名过滤器允许您定义规则,排除匹配特定模式的文件——例如,排除 .git 目录、node_modules.DS_Store.env 文件,防止意外上传。这是一个关键的安全保障:将包含数据库凭据或API密钥的 .env 文件上传到公共Web根目录是严重的安全事故。

脚本化/自动化FTP传输

对于CI/CD流水线或定时部署,FileZilla图形界面并不适用。请改用命令行 lftp 工具:

lftp -u username,password sftp://your-server.com << 'EOF'
set sftp:auto-confirm yes
mirror --reverse --delete --verbose /local/project/ /public_html/
EOF

--reverse 标志用于上传(本地到远程),--delete 删除本地不存在的远程文件(谨慎使用),--verbose 记录每次操作。此模式适用于可通过SSH访问的VPS Hosting环境的自动化部署。

通过SSH使用 rsync 作为FTP替代方案

对于大型部署或增量同步,通过SSH使用 rsync 比FTP效率高得多,因为它只传输文件中已更改的数据块,而非整个文件:

rsync -avz --progress --delete /local/project/ user@your-server.com:/public_html/
    -a——归档模式(保留权限、时间戳、符号链接)
    -v——详细输出
    -z——传输过程中压缩数据
    --delete——删除本地已删除的远程文件
    
    rsync 需要SSH访问权限,在共享托管控制面板中不可用,但对于任何您能控制服务器技术栈的环境,它都是正确的工具。
    常见FTP和SFTP问题排除
    连接超时或被拒绝
    
    验证主机名是否正确解析:nslookup ftp.yourdomain.com
  • 确认端口是否开放:telnet your-server.com 21nc -zv your-server.com 22
  • 检查服务器防火墙规则——在Linux上,iptables -Lufw status 将显示端口是否被允许
  • 对于SFTP,确认SSH守护进程正在运行:systemctl status sshd
  • 530 登录认证失败

    • 确认用户名完全正确——在Linux系统上FTP用户名区分大小写
    • 验证账户未被锁定:在服务器上执行 passwd -S username
    • 检查 /var/log/auth.log/var/log/secure 以获取拒绝原因
    • 如果使用cPanel,确认FTP账户未过期或被暂停

    550 上传时权限被拒绝

    远程目录未授予已认证FTP用户写入权限。检查所有权和权限:

    ls -la /public_html/

    如果目录由其他用户拥有,可调整所有权(chown)或授予组写入权限(chmod g+w)。在共享托管中,这通过托管控制面板的文件管理器处理。

    被动模式连接失败

    如果登录成功后看到”无法检索目录列表”,则服务器的被动端口范围不可达。在FileZilla中,转到编辑 > 设置 > FTP > 被动模式并尝试回退到主动模式。在服务器端,确保被动端口范围(通常为49152–65534)在防火墙中开放,并在FTP守护进程的设置中正确配置(例如 pasv_min_portpasv_max_portvsftpd.conf 中)。

    二进制与ASCII传输损坏

    在Windows客户端上以ASCII模式上传的PHP文件可能会进行Windows风格行尾(rn)转换,这可能导致某些解析器出错。确认FileZilla在传输 > 传输类型 > 二进制下设置为二进制模式。

    其他上传方式

    FTP并非总是合适的工具。以下替代方案值得了解:

    cPanel / Plesk文件管理器:可通过共享虚拟主机VPS控制面板上的Web控制面板访问。适合小型编辑和单文件上传。大多数实现中文件大小限制为2 GB,不适合批量传输。

    SCP(安全复制):一种简单、可脚本化的基于SSH的复制工具。无断点续传功能,无目录列表,但对于一次性传输极为可靠:

    scp -r /local/project/ user@your-server.com:/public_html/

    基于Git的部署:推送到服务器上的裸仓库,并使用 post-receive 钩子将文件检出到Web根目录。这是代码最简洁的部署模式——它提供版本历史、回滚能力,并完全消除手动文件管理。

    对象存储/CDN同步:对于静态资源,同步到兼容S3的存储桶并通过CDN提供服务,比基于FTP的部署更具可扩展性,并将Web服务器完全从静态资源交付路径中移除。

    快速决策矩阵:选择正确的传输方式

    场景推荐方式
    共享托管上的一次性文件编辑cPanel文件管理器
    无SSH的常规网站部署通过FileZilla使用SFTP
    自动化CI/CD流水线部署通过SSH使用 `lftp` 或 `rsync`
    大型二进制文件一次性传输`scp`
    增量代码部署`rsync` 或Git post-receive钩子
    需要FTP的旧系统最低使用FTPS(显式TLS)
    批量静态资源部署兼容S3的对象存储同步

    上线前的关键技术检查清单

    • 协议:仅使用SFTP或FTPS——生产服务器上绝不使用纯FTP
    • 凭据:使用专用FTP/SFTP账户,将访问范围限定到所需的最小目录,而非root或主系统用户
    • 传输模式:二进制,而非自动或ASCII
    • 文件权限:文件644,目录755——上传后验证
    • 敏感文件:通过文件名过滤器确认 .env.git/node_modules/ 及包含凭据的配置文件已从上传中排除
    • 校验和验证:传输后对关键文件进行MD5或SHA-256比较
    • 被动模式:在FTP客户端中默认启用
    • SSH密钥:对您控制的任何服务器上的SFTP使用基于密钥的认证;在可能的情况下在 sshd_config 中禁用密码认证

    常见问题解答

    FTP和SFTP有什么区别?

    FTP通过两个独立的TCP通道(控制通道在端口21,数据通道在端口20或临时端口)以明文传输数据和凭据。SFTP是一种完全不同的协议,建立在SSH之上,通过端口22上的单一加密通道多路复用所有内容。它们名称相似,但没有任何共同的协议代码。

    为什么FileZilla在凭据正确的情况下仍显示”连接超时”?

    认证前超时通常意味着服务器端口不可达——被防火墙阻止、服务未运行或主机名未解析到正确IP。认证后超时通常表明被动模式问题,即数据通道端口范围被防火墙拦截。请检查服务器端防火墙规则并确认被动端口范围已开放。

    我可以在没有控制面板的情况下使用FTP向VPS上传文件吗?

    可以。安装支持SFTP的SSH守护进程(OpenSSH,所有Linux发行版的标准配置)——无需额外的FTP服务器软件。使用FileZilla通过SFTP协议在端口22上连接,并使用您的SSH凭据或密钥对。这是任何VPS Hosting环境的推荐方式。

    通过FTP上传后WordPress文件应该设置什么权限?

    WordPress核心文件应为644,目录755,wp-config.php 应为600(仅所有者读/写)。wp-content/uploads 目录需要755或775,以便Web服务器写入上传的媒体文件。任何WordPress目录都不要设置为777。

    通过FTP上传文件有大小限制吗?

    FTP和SFTP本身没有固有的文件大小限制——传输是流式进行的。实际限制来自服务器端磁盘配额、PHP的 upload_max_filesize(与FTP无关,因为FTP完全绕过PHP)或文件系统限制(ext4支持最大16 TB的文件)。对于共享虚拟主机,托管服务提供商可能会强制执行磁盘配额,限制总存储空间而非单个文件大小。

    15%

    全场主机优惠15%

    测试技能,享折扣

    使用代码:

    Skills
    开始使用