AWS S3大文件上传失败:socket.error 10054连接被强制关闭求助
解决S3大文件上传时Socket连接被强制关闭的问题
这个[Errno 10054]错误太常见了——当你用单线程上传GB级大文件时,长时间的连接或者超大的数据量很容易让服务端、防火墙或者中间网络设备主动断开连接。你用的set_contents_from_filename和set_contents_from_file都是单线程一次性上传,完全不适合处理7GB这种级别的文件。
解决这个问题的核心就是用分块上传(Multipart Upload),把大文件拆成多个小分块分别上传,最后再合并成完整文件。下面给你两种实用的解决方案,都是基于你正在用的boto库:
方案一:用自动分块上传(最简单)
boto提供了multipart_upload_from_filename方法,会自动帮你处理分块、上传和合并,几乎不用额外配置:
import boto import os import sys # 替换成你的密钥和文件路径 AWS_ACCESS_KEY_ID = 'your-access-key' AWS_SECRET_ACCESS_KEY = 'your-secret-key' latest_file = 'path-to-your-7gb-file' # 建立S3连接 s3_connection = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) bucket = s3_connection.get_bucket('yardi-backup') key = boto.s3.key.Key(bucket, os.path.basename(latest_file)) # 设置分块大小(这里用10MB,你可以根据网络情况调整,5MB到5GB之间都可以) chunk_size = 10 * 1024 * 1024 try: # 执行分块上传 key.multipart_upload_from_filename(latest_file, chunksize=chunk_size) print("7GB文件上传成功!") except Exception as e: print(f"上传失败:{str(e)}") sys.exit(1) sys.exit(0)
方案二:手动控制分块上传(更灵活)
如果需要更精细的控制(比如自定义重试逻辑、监控分块上传进度),可以手动初始化分块上传,逐个上传分块,最后完成合并:
import boto import os import sys AWS_ACCESS_KEY_ID = 'your-access-key' AWS_SECRET_ACCESS_KEY = 'your-secret-key' latest_file = 'path-to-your-7gb-file' chunk_size = 10 * 1024 * 1024 # 10MB每块 # 建立连接 s3_connection = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) bucket = s3_connection.get_bucket('yardi-backup') key_name = os.path.basename(latest_file) # 初始化分块上传任务 mp = bucket.initiate_multipart_upload(key_name) # 分块读取文件并上传 with open(latest_file, 'rb') as f: part_number = 1 while True: chunk_data = f.read(chunk_size) if not chunk_data: break # 文件读取完毕 # 上传当前分块 mp.upload_part_from_file(f, part_number) part_number += 1 # 完成分块上传,合并所有分块 mp.complete_upload() print("大文件上传完成!") sys.exit(0)
一些额外的注意事项
- 分块大小建议在5MB到5GB之间(S3要求除了最后一块,其他分块至少5MB),网络稳定的话可以设大一点,减少请求次数;
- 先确保你的boto是最新版本,旧版本可能有分块上传的bug,执行
pip install --upgrade boto更新; - 如果上传中途中断,
multipart_upload_from_filename会自动重试失败的分块,但手动分块的话需要自己加重试逻辑; - 彻底放弃用
set_contents_from_file/set_contents_from_filename处理大文件,这些方法只适合小文件上传。
内容的提问来源于stack exchange,提问作者Yang L
相关产品推荐
相关产品推荐

