FTP无法完整传输大文件,请求排查故障原因
看起来你遇到了FTP传输大文件中途中断的问题,我之前也碰到过类似的情况,下面是几个最可能的原因和对应的解决办法:
1. 连接超时导致传输中断
大文件传输需要较长时间,而ftplib.FTP默认的超时时间可能不够,或者服务器端设置了连接超时阈值,导致传输到一半时连接被强制断开。
解决方法:
- 创建FTP会话时显式设置更长的超时时间:
session = ftplib.FTP('192.168.1.111', 'ubuntu', 'ubuntu', timeout=300) # 设置5分钟超时,可根据文件大小调整 - 如果文件特别大,还可以在传输过程中定期发送
NOOP命令保持连接(需要自定义回调函数):def keep_alive(block): session.voidcmd('NOOP') # 发送空命令维持连接 return block session.storbinary('STOR /home/ubuntu/yolo.weights', file, callback=keep_alive)
2. 未启用被动模式(Passive Mode)
很多现代网络环境(防火墙、NAT)和FTP服务器要求使用被动模式,而ftplib默认可能使用主动模式,这会导致数据连接无法稳定建立,传输到一半就中断。
解决方法:
登录FTP服务器后立即启用被动模式:
session = ftplib.FTP('192.168.1.111','ubuntu','ubuntu') session.set_pasv(True) # 启用被动模式,适配大多数网络环境
3. 服务器端目标磁盘空间不足
如果目标服务器的/home/ubuntu所在磁盘剩余空间小于要传输的文件大小,传输到磁盘空间耗尽时就会自动停止。
解决方法:
登录目标Linux机器,执行以下命令检查磁盘空间:
df -h /home/ubuntu
确保剩余空间大于待传输文件的大小。
4. 未捕获传输过程中的异常
你的代码没有任何异常处理逻辑,传输过程中可能发生了网络波动、服务器端错误等问题,但程序直接终止,你无法看到具体错误信息。另外注意:你代码里的ftplib.FTP.dir(session)是错误用法,正确的调用方式是session.dir()。
优化后的代码(带异常捕获):
import ftplib try: session = ftplib.FTP('192.168.1.111','ubuntu','ubuntu', timeout=300) session.set_pasv(True) with open('/home/nehal/darknet/yolo.weights','rb') as file: print(session.pwd()) session.dir() # 正确调用FTP目录查看方法 session.storbinary('STOR /home/ubuntu/yolo.weights', file) session.quit() print("文件传输完成!") except ftplib.all_errors as e: print(f"FTP传输错误: {e}")
内容的提问来源于stack exchange,提问作者user7441




