首页 > 解决方案 > 尽管响应成功,但无法将 s3 文件上传到另一个区域(客户端存储桶)

问题描述

这是我的代码。我正在尝试将目录从一个存储桶复制到另一个存储桶。我看到一切都是积极的,但文件没有出现在客户端存储桶中。

import boto3

ACCESS_KEY = 'access_key'
SECRET_KEY = 'secret_key'
REGION_NAME = 'US_EAST_1'

source_bucket = 'source_bucket'

#Make sure you provide / in the end 
source_prefix = 'source_prefix'

target_bucket = 'target-bucket'
target_prefix = 'target-prefix'

client = boto3.client('s3')
session_src = boto3.session.Session()
source_s3_r = session_src.resource('s3')

def get_s3_keys(bucket, prefix):
    keys = []
    response = client.list_objects_v2(Bucket=bucket,Prefix=prefix,MaxKeys=100)
    for obj in response['Contents']:
        keys.append(obj['Key'])
    return keys


session_dest = boto3.session.Session(aws_access_key_id=ACCESS_KEY, 
aws_secret_access_key=SECRET_KEY)
dest_s3_r = session_dest.resource('s3')

# create a reference to source image
old_obj = source_s3_r.Object(source_bucket, source_prefix)

# create a reference for destination image
new_obj = dest_s3_r.Object(target_bucket, target_prefix)

keys = get_s3_keys(source_bucket, source_prefix)

responses = []
# upload the image to destination S3 object
for filename in keys:
    print("Transferring file {}, {}".format(source_bucket,filename))
    old_obj = source_s3_r.Object(source_bucket, filename)
    response = new_obj.put(Body=old_obj.get()['Body'].read())
    response_code = response['ResponseMetadata']['HTTPStatusCode']
    responses.append(response_code)
    print("File transfer response {}".format(response_code))

distinct_response = list(set(responses))

if len(distinct_response) > 1 or distinct_response[0] != 200:
    print("File could not be transfered to krux bucket. Exiting now")
    exit(1)
else:
    print("File transfer to krux bucket successful")

我收到 200 的成功响应代码,但文件未传输。

标签: pythonamazon-s3boto3

解决方案


Srinivas,试试这个我使用了 S3 资源对象,如果你想试试等效的 S3 客户端......

bucket= s3.Bucket(bucket_name)    #from_bucket
for osi in bucket.objects.all():    
  print(osi)
  copy_source={
    'Bucket': bucket.name, 
    'Key': osi.key 
    }   
  s3.Bucket('to_bucket').copy(copy_source, osi.key)

希望它有帮助.. r0ck


推荐阅读