You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动