天天看點

S3 Multi Part Upload 中斷後續傳上傳大檔案示例中斷後續傳

我們上傳大檔案時難免出錯,但又不願意重新開始傳,這裡介紹如何利用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