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
相关产品推荐
相关产品推荐

