S3 Multi Part Upload 中断后续传

本文介绍如何使用boto库实现大文件的分段上传至Amazon S3,并提供了中断后如何继续上传的方法。示例代码展示了如何初始化上传任务、分块发送文件以及完成上传流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们上传大文件时难免出错,但又不愿意重新开始传,这里介绍如何利用boto,继续中断的 multi part upload。

上传大文件示例

import math, os
import boto
import boto.s3.connection
from filechunkio import FileChunkIO

CONS_AK = 'RC35MU8KM1PMEQ4EFD46'
CONS_SK = 'Fg1KO10FS4uIPzSoKenmKAR2YHt052rM9u8VDik9'

# Connect to S3
c = boto.connect_s3(
            aws_access_key_id=CONS_AK,
            aws_secret_access_key=CONS_SK,
            host='yhg-2',
            port=80,
            is_secure=False,
            calling_format=boto.s3.connection.OrdinaryCallingFormat()
        )

# b = c.get_bucket('mybucket')
b = c.create_bucket('mybucket')

# Local file path
source_path = './local-50M-file'
source_size = os.stat(source_path).st_size

# Create a multipart upload request
mul_key = 'HEHE'
header = {
    'x-amz-meta-gang': 'Yang Honggang'
}
# Record upload id
# upload_id = mp.id
mp = b.initiate_multipart_upload(mul_key, headers=header)

# Use a chunk size of 20 MiB (feel free to change this)
chunk_size = 20971520
chunk_count = int(math.ceil(source_size / float(chunk_size)))

# Send the file parts, using FileChunkIO to create a file-like object
# that points to a certain byte range within the original file. We
# set bytes to never exceed the original file size.
for i in range(chunk_count):
    offset = chunk_size * i
    bytes = min(chunk_size, source_size - offset)
    with FileChunkIO(source_path, 'r', offset=offset,
            bytes=bytes) as fp:
        mp.upload_part_from_file(fp, part_num=i + 1)

print "before complete"
# Finish the upload
mp.complete_upload()

中断后续传

假如上传文件过程中断,如何恢复上传呢?我们首先需要有 upload_id。

   import boto
   import boto.s3.connection
   from boto.s3.multipart import MultiPartUpload

   CONS_AK = 'RC35MU8KM1PMEQ4EFD46'
   CONS_SK = 'Fg1KO10FS4uIPzSoKenmKAR2YHt052rM9u8VDik9'
   
   # Connect to S3
   c = boto.connect_s3(
               aws_access_key_id=CONS_AK,
               aws_secret_access_key=CONS_SK,
               host='yhg-2',
               port=80,
               is_secure=False,
               calling_format=boto.s3.connection.OrdinaryCallingFormat()
           )
   
   bucket_name = 'mybucket'
   b = c.get_bucket(bucket_name)
   mul_key = 'my-multi-obj'
   
   upload_id = '2~QfkgBbGqlzGDNPbGCvTyREOudXl4YY4'
   mp = MultiPartUpload(b)
   mp.key_name = mul_key
   mp.bucket_name = 'mybucket'
   mp.id = upload_id
   
   # Continue mp.upload_part_from_file() 
   # Finish the upload
   mp.complete_upload()

对于rgw,也可以通过如下命令查看中断的上传操作

# rados -p .rgw.buckets.extra ls --cluster yhg


### 对象存储服务中文件上最大限制为2MB的解决方案 对于对象存储服务中的文件上,如果遇到单个文件大小被限制在2MB的情况,有几种常见的方式可以解决问题: #### 1. 分片上机制 分片上允许将较大的文件分割成多个较小的部分分别上至服务器。每一片独立输,在全部片段完成之后再由目标系统组合还原完整的文件。这种方式不仅解决了单一请求体过大的问题,还提高了网络不稳定条件下的成功率。 ```python import boto3 s3_client = boto3.client('s3') def upload_part(bucket, key, file_path, part_number, multipart_upload_id): with open(file_path, 'rb') as f: response = s3_client.upload_part( Bucket=bucket, Key=key, PartNumber=part_number, UploadId=multipart_upload_id, Body=f.read(2 * 1024 * 1024) # Read up to 2 MB per chunk ) return response['ETag'] # Example usage of the function above within a larger context that handles initiating and completing multi-part uploads. ``` 此方法适用于大多数支持断点续特性的云平台[^1]。 #### 2. 修改配置参数 部分对象存储服务商提供了调整默认设置的能力,比如通过API接口或者控制台界面来增加单次HTTP POST/PUT操作所能携带的数据量上限。然而需要注意的是,并不是所有的供应商都开放此类权限给最终用户修改;而且即使能够更改,默认值通常是经过性能考量设定的最佳实践建议值。 当考虑改变这些预设时应当谨慎评估潜在影响并遵循官方指导说明[^3]。 #### 3. 使用代理层或网关 另一种策略是在应用程序与实际的对象存储之间部署一层中间件——即所谓的“反向代理”或“网关”。这层组件负责接收来自客户端的大尺寸资源流并将它们分解为满足下游目的地接受标准的小包形式转发出去。这样做可以在不改动现有基础设施的前提下间接突破原有的约束。 这种架构设计特别适合那些难以直接接触底层存储系统的场景下采用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值