Boto3:无法在put / upload上设置元数据

时间:2017-10-19 16:35:22

标签: python python-3.x amazon-s3 boto3

以下代码:

client = boto3.client(
    's3',
    aws_access_key_id='AKIA...',
    aws_secret_access_key='',
    aws_session_token=True
        )
client.put_object(
    Bucket=input_bucket,
    Key=file_name_final,
    Body=open(tmp_file_name, 'r'),
    Metadata={'a':'b'}
)

崩溃:

Metadata={'a':'b'} TypeError: Unicode-objects must be encoded before hashing

另一方面,使用资源:

s3 = boto3.resource(
    's3',
    aws_access_key_id='AKIA...',
    aws_secret_access_key='m/twhd6ow8aRuf+gjQcL8gu+bS5Y3tAVjcTe1+ai',
    aws_session_token=True
)
my_bucket = s3.Bucket(input_bucket)
upfile = my_bucket.Object(file_name_final);
meta = {'a':'b'}
upfile.upload_file(
    tmp_file_name,
    ExtraArgs={"Metadata":meta}
)

ExtraArgs={"Metadata":meta} : AttributeError: 'bool' object has no attribute 'split'

崩溃

我想我已尝试过str(' b',' utf-8 / ascii'),。encode()和.decode()的所有变体,而且有些非常愚蠢事情,但没有。救命?

2 个答案:

答案 0 :(得分:0)

试试这个。

import boto3
s3 = boto3.resource('s3')
s3.Object('input_bucket', 'file_name_final').put(Body='hello world', Metadata={'foo': 'bar'})

参考:boto3-s3-put-documentation

答案 1 :(得分:0)

如果您只想上传我使用过:

s3=boto3.client('s3')
s3.upload_file("file","destinationBucket","destinationFile",ExtraArgs={"Metadata":{"meta1:val1","meta2:val2"})