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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:56:13