我是一名 Web 开发人员,几周前,我在通过 FTP 上传文件到服务器时发现一个奇怪的问题。
一些文件似乎是随机上传的,大小为 0kb 的空文件。起初我以为是我客户的服务器出了问题,但其他几台服务器也一直出现这种情况,包括我自己的服务器,我的服务器非常高端,从未出现过类似的问题。
如果我重新上传空文件,它们会上传得很好,这让我相信这是一个间歇性问题,但如果我覆盖整个文件,其他一些不同的文件会上传为空白文件。我一直在手动查找 0kb 文件并逐个替换它们,但当你有一个包含 1,000 个文件和大量文件夹的 CMS 时,这并不好玩。
我尝试了不同的 FTP 客户端,但这种情况一直发生。我认为问题出在我的硬盘上,所以我使用外部驱动器进行了测试并从那里上传。问题依旧。
Cyberduck 返回 PASV 450(未采取行动)错误。
我了解到这可能是网络问题,并按照说明将网络的 MTU 更改为 1300,但也没有成功。
我正在运行 OS X 10.8.2。
答案1
我的建议是在 Mac 上的 Cyberduck 上启用日志记录,然后由于您也有自己的 FTP 服务器,因此请在 FTP 服务器上启用日志记录。
当问题发生时,记下错误的确切文件名和日期/时间,然后检查客户端和服务器的日志文件,看是否有任何明显的问题。
如果服务器从 PASV 命令返回 400 级响应,则服务器可能存在问题,无法生成用于文件传输的可用数据端口。可能是资源不足,或者遇到了其他服务器限制。
奇怪的是这个 0 字节文件。如果在 STOR 命令之前发出 PASV 命令,并且它返回负 400 级回复,则客户端不应发出 STOR 来创建文件,因此您不应该看到服务器上创建任何文件。但是,如果客户端出现故障,并且在 PASV 命令之前发送 STOR 文件名,这可能会在服务器上创建一个文件,期望 PASV 交换成功,而当它失败时,服务器上会留下一个 0 字节文件。
查看服务器日志可以知道发生了什么。
答案2
检查您的系统是否设置为使用被动模式进行 FTP 传输。
在系统偏好设置中,转到网络 → 高级... → 代理并确保已勾选“使用被动 FTP 模式 (PASV)”。
简而言之,与被动模式相反的是主动模式,即服务器发起与客户端的连接。如果服务器无法打开此连接(由于防火墙、NAT 路由等),则文件上传失败并出现错误 450。