You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.11中ftplib+ssl上传文件时出现ssl.SSLEOFError的排查

解决FTPS上传单文件后连接中断的SSLEOFError问题

可能的原因与修复方案

1. 每次上传后重新建立连接

部分FTPS服务器会在单个数据传输完成后主动关闭连接,导致后续操作触发SSL错误。可以拆分上传流程,每传完一个文件就重新初始化连接:

from ftplib import FTP_TLS

def upload_file(server, user, passwd, local_path, remote_name):
    ftp = FTP_TLS(server)
    ftp.login(user, passwd)
    ftp.prot_p()  # 开启数据连接加密
    with open(local_path, 'rb') as f:
        ftp.storbinary(f'STOR {remote_name}', f)
    ftp.quit()

# 上传两个文件
upload_file('your_server', 'user', 'pass', 'file1.mp3', 'file1.mp3')
upload_file('your_server', 'user', 'pass', 'file2.mp3', 'file2.mp3')

2. 调整SSL上下文兼容服务器配置

部分老旧服务器对高版本SSL/TLS协议或加密套件支持不佳,可修改上下文参数适配:

from ftplib import FTP_TLS
import ssl

ctx = ssl.create_default_context()
ctx.set_ciphers('DEFAULT@SECLEVEL=1')  # 降低安全级别兼容旧服务器
ctx.options &= ~ssl.OP_NO_TLSv1_2  # 启用TLSv1.2(需服务器支持)

ftp = FTP_TLS('your_server', context=ctx)
ftp.login('user', 'pass')
ftp.prot_p()

# 依次上传文件
for filename in ['file1.mp3', 'file2.mp3']:
    with open(filename, 'rb') as f:
        ftp.storbinary(f'STOR {filename}', f)
    # 上传后重置数据连接
    ftp.voidcmd('NOOP')  # 发送空命令保持控制连接活跃

ftp.quit()

3. 禁用数据连接的SSL复用

强制每次数据传输使用新的SSL上下文,避免连接复用引发的EOF异常:

from ftplib import FTP_TLS
import ssl

class FreshConnFTP_TLS(FTP_TLS):
    def ntransfercmd(self, cmd, rest=None):
        # 每次传输前重新创建SSL上下文
        self.ssl_context = ssl.create_default_context()
        return super().ntransfercmd(cmd, rest)

ftp = FreshConnFTP_TLS('your_server')
ftp.login('user', 'pass')
ftp.prot_p()

# 批量上传文件
for filename in ['file1.mp3', 'file2.mp3']:
    with open(filename, 'rb') as f:
        ftp.storbinary(f'STOR {filename}', f)

ftp.quit()

4. 核查服务器端限制

结合你提供的服务器openssl检测信息,确认服务器是否配置了单连接文件传输数量限制或短超时阈值。若服务器强制单连接仅允许传输一个文件,方案1是最直接的解决方式。


内容的提问来源于stack exchange,提问作者nwood21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:52:43