大文件分段上传 获取需要续传的对象的UploadId和Key,这里以第一个对象为例 uploadId uploadInfo[0]['UploadId'] key uploadInfo[0]['Key'] 获取已经完成上传的分块信息 response s3client.listparts(BucketbucketName, Keykey, UploadIduploadId) finishedPartsInfo response['Parts'] 设置列表,用于记录当前已经完成上传分块的编号。 finishedPartNumbers [] 记录分块的大小。 partSize 0 设置列表,用于收集上传分块的ETag和编号。 parts [] for finishedPart in finishedPartsInfo: finishedPartNumbers.append(finishedPart['PartNumber']) if partSize < finishedPart['Size']: partSize finishedPart['Size'] part { 'ETag': finishedPart['ETag'], 'PartNumber': finishedPart['PartNumber'] } parts.append(part) 设置列表,用于收集文件的所有分块 chunks [] 分块读取文件 with open(filePos, 'rb') as f: while True: chunk f.read(partSize) 此处输入分块大小,本示例是5M,分块大小最低为5M if not chunk: break chunks.append(chunk) i 0 for chunk in chunks: i + 1 当该分块已经完成上传时,跳过。 if i in finishedPartNumbers: continue 上传分块 response s3client.uploadpart(BucketbucketName, Bodychunk, Keykey, PartNumberi, UploadIduploadId) 记录该分块的ETag和编号 part { 'ETag': response['ETag'], 'PartNumber': i, } parts.append(part) 完成整个拼接传入 s3client.completemultipartupload( BucketbucketName, Keykey, MultipartUpload{ 'Parts': parts }, UploadIduploadId ) print('文件上传成功!') except BaseException: print("上传异常,请检查各个参数后重试。") finally: f.close()